1.暴力搜索从每一个字符开始的可能性。
2.DFS条件
a.递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k 。
b.终止条件:
返回 false : (1) 行或列索引越界 或 (2) 当前矩阵元素与目标字符不同 或 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) ) 。
返回 true : k = len(word) - 1 ,即字符串 word 已全部匹配。
c.递推工作:
标记当前矩阵元素: 将 board[i][j] 修改为 空字符 '' ,代表此元素已访问过,防止之后搜索时重复访问。
搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。
还原当前矩阵元素: 将 board[i][j] 元素还原至初始值,即 word[k] 。
返回值: 返回布尔量 res ,代表是否搜索到目标字符串
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for(int i = 0;i<board.length;i++){
for(int j = 0;j<board[0].length;j++){
//每一个字符都需要遍历,即从每一个点开始dfs,看能否找到符合要求的word!
if(dfs(board, words, i, j, 0)) return true;
//return dfs(board, words, i, j, 0); 写错了,这一句只能用来return true判断,不能return false,所以这样写是不对的
}
}
return false;
}
public boolean dfs(char[][]board, char[] word,int i, int j, int k){
if(i > board.length-1 || i<0 || j > board[0].length-1 || j<0 || board[i][j] != word[k]) return false;
if(k == word.length -1) return true;
//走到这一步时说明已经有某个字符匹配上,将此字符标记,防止下一个字符往回搜索
board[i][j] = '\0';
boolean res = dfs(board, word, i, j+1, k+1)||dfs(board, word, i-1, j, k+1)||dfs(board, word, i+1, j, k+1)||dfs(board, word, i, j-1, k+1);
//若上一行返回true,则说明找到;若返回false,说明当前字符开始遍历dfs失败,需要换下一个字符开始遍历,需要还原字符!!
board[i][j] = word[k];
return res;
}
}