题目描述:

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[[“a”,”b”,”c”,”e”],
[“s”,”f”,”c”,”s”],
[“a”,”d”,”e”,”e”]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

示例 1:

输入:board = [[“A”,”B”,”C”,”E”],[“S”,”F”,”C”,”S”],[“A”,”D”,”E”,”E”]], word = “ABCCED”
输出:true
示例 2:

输入:board = [[“a”,”b”],[“c”,”d”]], word = “abcd”
输出:false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof

知识点:

  • 矩阵遍历,回溯

解题思路:

  • 这道题要求我们遍历一个矩阵,查找矩阵中有没有符合要求的路径,对于矩阵的题我们首先应该想到要有一个同样的矩阵或者数组来记录当前路径是否走过
  • 首先我们需要遍历矩阵中的每一个节点,只要有任意一个节点出发的路径符合条件就return true
  • 我们需要使用一个变量来记录走过的步数,根据步数判断是否找到符合条件的路径
  • 这道题访问矩阵的的方法直接为matrix[index]便好
  • 我们首先需要判断当前节点是否走过,以及是否走出边界,是否已经不符合目标路径了,此时返回false便好
  • 之后需要判断是否已经找到符合条件的路径,返回true,并且当前节点设置为已经走过
  • 之后要在当前节点的任意方向来判断一下
  • 不符合题意的话使用回溯,return false

解题代码:

  1. function hasPath(matrix, rows, cols, path)
  2. {
  3. // write code here
  4. const visited = new Array(matrix.lengtg).fill(false);
  5. for(let i = 0;i < rows;i++) {
  6. for(let j = 0;j<cols;j++) {
  7. if(findPath(matrix,i,j,0)) {
  8. return true;
  9. }
  10. }
  11. }
  12. return false;
  13. function findPath(matrix,i,j,step){
  14. let index = i * cols + j;
  15. if(i < 0 || j < 0 || i >= rows
  16. || j >= cols || visited[index] || matrix[index] !== path[step]) {
  17. return false;
  18. }
  19. visited[index] = true;
  20. if(step === path.length - 1) return true;
  21. if(findPath(matrix,i+1,j,step+1) ||
  22. findPath(matrix,i,j+1,step+1) ||
  23. findPath(matrix,i-1,j,step+1) ||
  24. findPath(matrix,i,j-1,step+1)) {
  25. return true;
  26. }
  27. visited[index] = false; // 将当前节点值设置为false,方便其他节点的查找
  28. return false;
  29. }
  30. }