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++){
if (dfs(board,words,i,j,0)){
return true;
}
}
}
return false;
}
boolean dfs(char[][] board, char[] word, int i, int j, int k) {
// 超过边界或不相等时结束判断
if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) {
return false;
}
// 完全匹配了
if (k == word.length - 1) {
return true;
}
// 标记已访问
board[i][j] = '\0';
// dfs 遍历四边
boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i, j - 1, k + 1);
// 回溯
board[i][j] = word[k];
return res;
}
}
class Solution {
private int m;
private int n;
private boolean[][] visited;
public boolean exist(char[][] board, String word) {
m = board.length;
n = board[0].length;
visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (dfs(board, i, j, word, 0)) {
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board, int row, int col, String word, int depth) {
if (visited[row][col]) {
return false;
}
if (board[row][col] != word.charAt(depth)) {
return false;
}
if (word.length() - 1 == depth) {
return true;
}
visited[row][col] = true;
// 遍历当前阶段的解
for (int i = - 1; i <= 1; i++) {
for (int j =- 1; j <=+ 1; j++) {
if (i + row < m && i + row >= 0 && j + col >= 0 && j + col < n && i !=j && i != -j ) {
if(dfs(board, i + row, j + col, word, depth + 1)) {
return true;
}
}
}
}
visited[row][col] = false;
return false;
}
}
共以下 5 个回答
dsf,一个visited数组记录访问过的节点
dfs