题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"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 ;
}
}