题目
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出
![](https://img-blog.csdnimg.cn/img_convert/fe23885c6a15c80fa70bf4b93d628493.png)
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成
思路:利用回溯法递归即可,记得查找完之后需要改回visited状态
题解
两套实现代码
public boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
boolean flag = check(board, visited, i, j, word, 0);
if (flag) {
return true;
}
}
}
return false;
}
public boolean check(char[][] board, boolean[][] visited, int i, int j, String word, int cur) {
if (board[i][j] != word.charAt(cur)) {
return false;
} else if (cur == word.length() - 1) {
return true;
}
visited[i][j] = true;
int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
boolean result = false;
for (int[] dir : directions) {
int newi = i + dir[0], newj = j + dir[1];
if (newi >= 0 && newi < board.length && newj >= 0 && newj < board[0].length) {
if (!visited[newi][newj]) {
boolean flag = check(board, visited, newi, newj, word, cur + 1);
if (flag) {
result = true;
break;
}
}
}
}
visited[i][j] = false;
return result;
}
public static boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
boolean[][] visit = new boolean[m][n];
char[] wordChar = word.toCharArray();
boolean result = false;
for (int i = 0 ;i < m ; i++) {
for (int j = 0; j< n ;j++) {
if (wordChar[0] == board[i][j]) {
visit[i][j] = true;
result = findNext(board,visit, wordChar, 1, i, j+1) ||
findNext(board,visit, wordChar, 1, i, j-1) ||
findNext(board,visit, wordChar, 1, i+1, j) ||
findNext(board,visit, wordChar, 1, i-1, j);
if (result) {
return result;
}
visit[i][j] = false;
}
}
}
return result;
}
public static boolean findNext(char[][] board, boolean[][] visit, char[] wordChar, int cur, int i, int j) {
if (cur == wordChar.length) {
return true;
}
//判断越界
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) {
return false;
}
//终止条件
if (visit[i][j] || board[i][j] != wordChar[cur]) {
return false;
}
visit[i][j] = true;
boolean result = findNext(board,visit, wordChar, cur + 1, i, j+1) ||
findNext(board,visit, wordChar, cur + 1, i, j-1) ||
findNext(board,visit, wordChar, cur + 1, i+1, j) ||
findNext(board,visit, wordChar, cur + 1, i-1, j);
visit[i][j] = false;
return result;
}