这题是非常明显的DFS,但小陷阱非常多,改了很多次才通过。
- 首先给出的函数输入是一个一维数组,我非常不善于在一维数组识别行列,所以先把数组转换成了二维,也方便dfs时识别边界。
- 判断是否用过的visited也可以用别的方式,可以放在全局变量不用随参数每次遍历,需要用到输入参数可以在全局中声明,在函数中复制即可。
- 我开始想的是先遍历一遍数组找到开头,但是如题目中e开头就有很多种,这样就不合适了,且按原方法判断过的开头会把visited都改变了影响后面判断,所以一定是DFS**回溯!**对每个点判断且需要把判断过的还原。
- DFS过程中首先必须判断边界!index会越界一定要最先判断在这里卡了好久,然后是成立条件,标答中有dfs模板值得参考。
dfs(){
// 第一步,检查下标是否满足条件
// 第二步:检查是否被访问过,或者是否满足当前匹配条件
// 第三步:检查是否满足返回结果条件
// 第四步:都没有返回,说明应该进行下一步递归
// 标记
dfs(下一次)
// 回溯
}
main() {
for (对所有可能情况) {
dfs()
}
}
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
boolean[][] visited = new boolean[rows][cols];
char[][] m = new char[rows][cols];
for (int i = 0; i < rows ; i++) {
for(int j = 0; j < cols; j++) {
m[i][j] = matrix[i*cols + j];
}
}
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
if(helper(m, i, j, str, 0, visited)) return true;
return false;
}
public boolean helper(char[][] m, int r, int c, char[] str, int index, boolean[][] visited){
if(index >= str.length) return true;
if(r < 0 || c < 0 || r >= m.length || c >= m[0].length || m[r][c] != str[index] || visited[r][c] == true) return false;
visited[r][c] = true;
boolean ans = helper(m, r-1, c, str, index+1, visited)
|| helper(m, r, c-1, str, index+1, visited)
|| helper(m, r+1, c, str, index+1, visited)
|| helper(m, r, c+1, str, index+1, visited);
visited[r][c] = false;
return ans;
}
}