
/**
大致执行流程(双for + dfs):
双重for循环,枚举尝试以每个节点为起点启动dfs。
利用visited维护访问状态,已访问过的节点直接跳过,避免重复枚举到已访问过的节点
dfs:
终止条件-> index == word.length() 所有字符都被搜寻到,返回true
若越界、重复访问、非目标元素 直接返回false,更换搜索路径
搜寻过程中将已访问过的节点设置为已访问,避免递归调用与枚举时重复访问
递归调用时增加index,控制本次搜寻的目标字符
四个路径分支只要一个为true就可以结束,无需继续访问其余路径,用||实现
回溯,恢复访问状态为未访问,避免影响到其他可能路径
*/
class Solution {
//避免重复传参
private char[][] board;
private String word;
private int row;
private int cols;
//记录访问状态
private boolean[][] visited;
public boolean exist(char[][] board, String word) {
/**
大致执行流程(双for + dfs):
双重for循环,枚举尝试以每个节点为起点启动dfs。
利用visited维护访问状态,已访问过的节点直接跳过,避免重复枚举到已访问过的节点
dfs:
终止条件-> index == word.length() 所有字符都被搜寻到,返回true
若越界、重复访问、非目标元素 直接返回false,更换搜索路径
搜寻过程中将已访问过的节点设置为已访问,避免递归调用与枚举时重复访问
递归调用时增加index,控制本次搜寻的目标字符
四个路径分支只要一个为true就可以结束,无需继续访问其余路径,用||实现
回溯,恢复访问状态为未访问,避免影响到其他可能路径
*/
//初始化
this.board = board;
this.word = word;
this.row = board.length;
this.cols = board[0].length;
this.visited = new boolean[row][cols];
for(int i = 0; i < row; i++) {
for(int j = 0; j < cols; j++) {
//只有当dfs返回true时才在此处返回,为false时继续向后搜寻,直到遍历结束
if(dfs(i, j, 0)) {
return true;
}
}
}
return false;
}
private boolean dfs(int x, int y, int index) {
if(index == word.length()) {
return true;
}
//越界 重复访问 非目标元素
if(x < 0 || x >= row || y < 0 || y >= cols || visited[x][y] || board[x][y] != word.charAt(index)) {
return false;
}
//标记为已访问
visited[x][y] = true;
//dfs 搜寻下一个元素
//使用||运算只要一个分支得到true 就可以终止后续执行
boolean res = dfs(x, y - 1, index + 1) || //上
dfs(x, y + 1, index + 1) || //下
dfs(x - 1, y, index + 1) || //左
dfs(x + 1, y , index + 1); //右
//回溯 返回搜索结果
visited[x][y] = false;
return res;
}
}
949

被折叠的 条评论
为什么被折叠?



