题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路:回溯+递归
具体想法的都在代码注释中了,如下:
import java.util.*;
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
if(matrix==null || matrix.length==0 || str==null || str.length==0 || matrix.length!=rows*cols || rows<=0 || cols<=0 || rows*cols < str.length) {
return false ;
}
//初始化标志位,用来表示矩阵中某个节点是否被访问过
boolean[] visited = new boolean[rows*cols] ;
//初始化匹配的第一个字符的位置,也就是0
int pathLength = 0 ;
//从矩阵的第一个位置开始,判断是否是字符串的第一个字符
for(int i=0 ; i<=rows-1 ; i++) {
for(int j=0 ; j<=cols-1 ; j++) {
if(hasPathCore(matrix, rows, cols, str, i, j, visited, pathLength)) { return true ; }
}
}
return false ;
}
public boolean hasPathCore(char[] matrix, int rows, int cols, char[] str, int row, int col, boolean[] visited, int pathLength) {
boolean flag = false ;
//如果找到了第一个字符,就把pathlength++,继续寻找下一个位置
if(row>=0 && row<rows && col>=0 && col<cols && !visited[row*cols+col] && matrix[row*cols+col]==str[pathLength]) {
pathLength ++ ;
visited[row*cols+col] = true ;
//递归的出口就是路径长度达到字符串长度
//或者四个位置都没有找到,就返回了false
if(pathLength ==str.length) { return true ; }
//从上下左右四个位置找只要有一个存在就可以,递归的去找下一个
flag = hasPathCore(matrix, rows, cols, str, row, col+1, visited, pathLength) ||
hasPathCore(matrix, rows, cols, str, row+1, col, visited, pathLength) ||
hasPathCore(matrix, rows, cols, str, row, col-1, visited, pathLength) ||
hasPathCore(matrix, rows, cols, str, row-1, col, visited, pathLength) ;
if(!flag) {
//四个位置都没有找到,就退一个位置,回溯
pathLength -- ;
visited[row*cols+col] = false ;
}
}
return flag ;
}
}
矩阵路径搜索算法

本文介绍了一个用于判断在矩阵中是否存在包含特定字符串所有字符路径的算法。通过回溯和递归方法,从矩阵任意位置开始,向四个方向移动,检查是否能形成目标字符串路径。文章详细解释了算法思路,并提供了完整的Java代码实现。
298

被折叠的 条评论
为什么被折叠?



