剑指Offer_65

题目

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

解题思路

回溯法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Solution {
public boolean hasPathHelper(char []matrix, int rows, int cols, char []str, int k, boolean []isVisited, int i, int j){
int pos = i * cols + j;
if(i < 0 || i >= rows || j < 0 || j >= cols || isVisited[pos] || matrix[pos] != str[k]){
return false;
}
if(k == str.length -1){
return true;
}
++k;
isVisited[pos] = true;
if( hasPathHelper(matrix, rows, cols, str, k, isVisited, i+1, j)
|| hasPathHelper(matrix, rows, cols, str, k, isVisited, i-1, j)
|| hasPathHelper(matrix, rows, cols, str, k, isVisited, i, j-1)
|| hasPathHelper(matrix, rows, cols, str, k, isVisited, i, j+1)){
return true;
}
isVisited[pos] = false;
return false;
}
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
boolean []isVisited = new boolean[rows * cols];
for(int i = 0; i < rows; ++i){
for(int j = 0; j < cols; ++j){
if(hasPathHelper(matrix, rows, cols, str, 0, isVisited, i, j)){
return true;
}
}
}
return false;
}
}