题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
[
a
b
c
e
s
f
c
s
a
d
e
e
]
\left[ \begin{matrix} a & b & c & e\\ s & f & c & s \\ a & d & e & e \end{matrix} \right]
⎣⎡asabfdcceese⎦⎤ 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
分析
本题用递归很容易理解,设置变量记录当前路径所走到的字符串的位置,从本格子的上、下、左、右递归地查找路径,若满足下一格子是所需的字符则继续从下一格子开始四周寻找再下一格的格子,直到找到整个字符串的路径。若本格子四周没能找到所需字符,那么回溯回去。设置数组记录矩阵中走了哪些格子。
此题和机器人走的范围的题目不同的是,机器人是从矩阵的左上角开始走的,而这题可以从任意格子开始走,只要找到一条符合的就可以输出了。
时间复杂度
O(n^2)
代码
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
int visited[][] = new int[rows][cols];
for(int i = 0;i < rows; i++){
for(int j = 0; j < cols; j++){
if(ifExist(matrix, rows, cols, str, i, j, visited, 0))
return true;
}
}
return false;
}
boolean ifExist(char[] matrix, int rows, int cols, char[] str, int i, int j, int [][] visited, int k){
int num = i*cols+j;
if(i<0 || i==rows || j<0 || j==cols || visited[i][j]==1 || str[k]!=matrix[num])return false;
//如果走完路径
if(k == str.length-1)return true;
//如果当前各自是所要
visited[i][j] = 1;
if(ifExist(matrix, rows, cols, str, i, j-1, visited, k+1)||
ifExist(matrix, rows, cols, str, i, j+1, visited, k+1)||
ifExist(matrix, rows, cols, str, i-1, j, visited, k+1)||
ifExist(matrix, rows, cols, str, i+1, j, visited, k+1))
return true;
//下一步不符合要求,回溯
visited[i][j] = 0;
return false;
}
}