题目:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/
这种路径的问题一般都是需要使用 DFS(深度优先遍历)
分别遍历上下左右 四个方向
dfs(i + 1, j, t + 1) || dfs(i - 1, j, t + 1) ||
dfs(i, j - 1, t + 1) || dfs(i, j + 1, t + 1);
递归终止条件:
if(i < 0 || j < 0 ||
i >= chBoard.length
|| j >= chBoard[i].length || chBoard[i][j] != words.charAt(t)){
return false;
}
//接下来就是符合条件的字符处理
//当查找到一条路径后,返回true,没有则继续执行
if( t == words.length() - 1 ) return true;
- 超限、字符不符合 返回false,终止此方向上的递归
- 在完全找到一条路径后 t == words.length() - 1 返回true,否则继续查找递归
这里有一点需要注意的:
题目中的字符是会重复的,所以我们递归完成后必须还原数组,利于下一次的查找遍历。
class Solution {
char[][] chBoard;
String words;
public boolean exist(char[][] board, String word) {
//上下 左右
this.chBoard = board;
this.words = word;
for(int i = 0; i < chBoard.length; i++){
for(int j = 0; j < chBoard[i].length; j++){
if(dfs(i,j,0)) return true;
}
}
return false;
}
//t 是标识第几个字符
boolean dfs(int i, int j, int t){
//需要暂存 chBoard的值
char temp;
//不符合条件的 返回false 结束这一方向上的递归
if(i < 0 || j < 0 ||
i >= chBoard.length || j >= chBoard[i].length || chBoard[i][j] != words.charAt(t)){
return false;
}
//接下来就是符合条件的字符处理
//当查找到一条路径后,返回true,没有则继续执行
if( t == words.length() - 1 ) return true;
//如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子
temp = chBoard[i][j];
//将遍历到并且合适的置为 -
chBoard[i][j] = '-';
//上下 左右
boolean res = dfs(i + 1, j, t + 1) || dfs(i - 1, j, t + 1) ||
dfs(i, j - 1, t + 1) || dfs(i, j + 1, t + 1);
//还原chBoard[i][j]的值
chBoard[i][j] = temp;
return res;
}
}