【剑指Offer】矩阵中的路径

题目

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

a b c e
s f c s
a d e e

实现

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
39
public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
if (matrix == null || rows < 1 || cols < 1 || str == null)
return false;

boolean[] visited = new boolean[matrix.length];

for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
if (hasPathHelper(matrix, rows, cols, i, j, str, 0, visited))
return true;
}

return false;
}

private boolean hasPathHelper(char[] matrix, int rows, int cols, int row, int col, char[] str, int strIdx, boolean[] visited) {
if (row < 0 || col < 0 || row >= rows || col >= cols)
return false;

int matrixIdx = row * cols + col;

if (visited[matrixIdx] || str[strIdx] != matrix[matrixIdx])
return false;

if (strIdx == str.length - 1)
return true;

visited[matrixIdx] = true;

boolean result = hasPathHelper(matrix, rows, cols, row - 1, col, str, strIdx + 1, visited)
|| hasPathHelper(matrix, rows, cols, row + 1, col, str, strIdx + 1, visited)
|| hasPathHelper(matrix, rows, cols, row, col - 1, str, strIdx + 1, visited)
|| hasPathHelper(matrix, rows, cols, row, col + 1, str, strIdx + 1, visited);

if (!result)
visited[matrixIdx] = false;

return result;
}