public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
//为空情况
if (matrix.length == 0 || str.length == 0) {
return false;
}
//是否访问过 默认false
boolean[] visited = new boolean[matrix.length];
int pathlength = 0;
//字串下标
//双重循环检测
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (hasPathCore(matrix, rows, cols, row, col, str, pathlength, visited)) {
return true;
}
}
}
return false;
}
public boolean hasPathCore(char[] matrix, int rows, int cols, int row, int col, char[] str, int pathlength,
boolean[] visited) {
int index = row * cols + col;
//长字符串下标
if (pathlength == str.length)
return true;
//越界返回true 越界说明找到 访问完了
if (row < 0 || row >= rows || col < 0 || col >= cols || matrix[index] != str[pathlength]
|| visited[index] == true)
return false;
//查找失败返回false
visited[index] = true;
//标记访问过
//访问上下左右 递归回溯
if (hasPathCore(matrix, rows, cols, row, col - 1, str, pathlength + 1, visited)
|| hasPathCore(matrix, rows, cols, row, col + 1, str, pathlength + 1, visited)
|| hasPathCore(matrix, rows, cols, row - 1, col, str, pathlength + 1, visited)
|| hasPathCore(matrix, rows, cols, row + 1, col, str, pathlength + 1, visited)) {
return true;
}
//失败退回上一个
visited[index] = false;
return false;
}
}