【问题标题】:Traveling a Grid for a Palindrome为回文遍历网格
【发布时间】:2015-04-05 23:00:18
【问题描述】:

我已经尝试解决这个问题很长时间了,除了一个幼稚的解决方案之外,我无法想出任何其他方法。基本上,我得到一个大小为 N 的字符网格,我必须在其中找到从左上角到右上角的不同路径的数量,当只有向下和向右移动时才会给出回文。

这是一个网格示例:

ABCD

BXZX

CDXB

WCBA

这个网格中有 12 个回文,例如“ABXZXBA”。我的解决方案是遍历网格中的所有路径,并通过为前 N 个字符保留一个字符堆栈并为接下来的 N 个字符弹出每个字符并检查它们是否相同来检查该字符串是否是回文。当 N 变得太大并且我不确定如何继续时,此解决方案会超时。任何伪代码或建议将不胜感激。

【问题讨论】:

  • 对于网格中的每个字符 C,搜索以 C 为中心字符的回文。注意会有像...xyzCzyx...和像...xyzCCzyx...这样的回文
  • 如果你只被允许“向下和向右”,你怎么能到达“右上角”?

标签: c++ algorithm dynamic graph graph-algorithm


【解决方案1】:

只是一个理论 - 我还没有尝试编写代码:

您可以从左上角和右下角开始,并保持路径同步。由于它是回文,因此从底部到顶部的路径中的字母必须相同。

每次在路径中查找下一步时,请检查反向步骤中是否有匹配的字母。

可以进一步限制反向步骤的可用路径,因为它不能到达正向步骤的左侧或上方。

当路径相遇时停止,这很复杂,因为它们可能最终位于相同的网格位置(奇数行),或者它们可能只是相遇(偶数行)。

回溯和堆栈保持可能有点复杂,因为您必须考虑(可能)几种反向步骤的选择,但它应该减少可能性的数量。最好将其视为正向和反向路径中的每一步都会为您提供一个新的(较小的)网格来检查回文。

【讨论】:

    【解决方案2】:

    这样的?

    (如果路径没有形成回文或超出范围/同步,至少它会停止。)

    JavaScript 代码:

    function f(m){
    
      var stack = [[0,0,m.length - 1,m.length - 1,""]],
          count = 0;
    
      while(stack.length > 0){
    
        var next = stack.pop(),
            y = next[0],
            x = next[1],
            yr = next[2]
            xr = next[3];
    
        if (y - yr > 0 || x - xr > 0){
          continue;
        } else if (m[y][x] != m[yr][xr]){
          continue;
        } else if (y == yr && x == xr){
          count++;
        } else {
          stack.push([y + 1,x,yr - 1,xr]);
          stack.push([y + 1,x,yr,xr - 1]);
          stack.push([y,x + 1,yr - 1,xr]);
          stack.push([y,x + 1,yr,xr - 1]);
        }
      }
    
      return count;
    }
    

    输出:

    var t = [["A","B","C","D"]
            ,["B","X","Z","X"]
            ,["C","D","X","B"]
            ,["W","C","B","A"]];
    
    console.log(f(t));
    
    12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-24
      • 2013-03-19
      • 2023-03-20
      • 1970-01-01
      • 2011-02-26
      • 2013-05-27
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多