👉️ 力扣原文
题目
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。。
示例
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false
分析思路1
回溯:
在搜索过程中,如果当前格子不是要找的字符,或者已经访问过了,就返回 false。如果当前格子是要找的字符,就标记为已访问,然后在上下左右四个方向继续搜索,如果其中有一个方向找到了目标单词,就返回 true,否则就回溯,标记为未访问,然后继续访问下一个格子。
题解1
class Solution {
public boolean exist(char[][] board, String word) {
if (board == null || board.length == 0 || board[0].length == 0) {
return false;
}
int m = board.length, n = board[0].length;
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (dfs(board, visited, word, i, j, 0)) {
return true;
}
}
}
return false;
}
private boolean dfs(char[][] board, boolean[][] visited, String word, int i, int j, int index) {
if (index == word.length()) {
return true;
}
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || visited[i][j] || board[i][j] != word.charAt(index)) {
return false;
}
visited[i][j] = true;
boolean res = dfs(board, visited, word, i - 1, j, index + 1) ||
dfs(board, visited, word, i + 1, j, index + 1) ||
dfs(board, visited, word, i, j - 1, index + 1) ||
dfs(board, visited, word, i, j + 1, index + 1);
visited[i][j] = false;
return res;
}
}
执行结果