题目

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

例如a b c e s f c s a d e e这样的3 X 4矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

     a b c e 
     s f c s 
     a d e e

思路

回溯算法 问题由多个步骤组成,并且每个步骤都有多个选项。

依次验证path中的每个字符(多个步骤),每个字符可能出现在多个方向(多个选项)

  • 1.根据给定的行列,遍历字符,根据行列数计算出字符位置
  • 2.判断当前字符是否满足递归终止条件
  • 3.递归终止条件:(1).行列越界 (2).与路径不匹配 (3).已经走过(需设定一个数组标识当前字符是否走过)
  • 4.若路径中的字符最后一位匹配成功,则到达边界且满足约束条件,找到合适的解
  • 5.递归不断寻找四个方向是否满足条件,满足条件再忘更深层递归,不满足向上回溯
  • 6.如果回溯到最外层,则当前字符匹配失败,将当前字符标记为未走
foo

代码

    function hasPath(matrix, rows, cols, path) {
      const flag = new Array(matrix.length).fill(false);
      for (let i = 0; i < rows; i++) {
        for (let j = 0; j < cols; j++) {
          if (hasPathCore(matrix, i, j, rows, cols, path, flag, 0)) {
            return true;
          }
        }
      }
      return false;
    }

    function hasPathCore(matrix, i, j, rows, cols, path, flag, k) {
      const index = i * cols + j;
      if (i < 0 || j < 0 || i >= rows || j >= cols || matrix[index] != path[k] || flag[index]) {
        return false;
      }
      if (k === path.length - 1) {
        return true;
      }
      flag[index] = true;
      if (hasPathCore(matrix, i + 1, j, rows, cols, path, flag, k + 1) ||
        hasPathCore(matrix, i - 1, j, rows, cols, path, flag, k + 1) ||
        hasPathCore(matrix, i, j + 1, rows, cols, path, flag, k + 1) ||
        hasPathCore(matrix, i, j - 1, rows, cols, path, flag, k + 1)) {
        return true;
      }
      flag[index] = false;
      return false;
    }

考察点

  • 回溯算法
  • 二维数组
Last Updated: 8/4/2019, 9:40:51 PM