单词搜索(DFS)
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED" 输出:true
示例 2:
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE" 输出:true
示例 3:
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCB" 输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
和word
仅由大小写英文字母组成
class Solution {int m, n;char[][] board;String word;int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};public boolean exist(char[][] board, String word) {this.board = board;this.word = word;m = board.length;n = board[0].length;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (dfs(i, j, 0)) return true;}}return false;}boolean dfs(int i, int j, int k) {if (k == word.length()) return true;if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word.charAt(k)) return false;char tmp = board[i][j]; // 临时保存当前字符,方便回溯时还原board[i][j] = '#'; // 标记该格子已使用,防止重复访问for (int[] d : dirs) {if (dfs(i + d[0], j + d[1], k + 1)) {board[i][j] = tmp; // 如果某个方向能匹配成功,恢复原字符并返回 truereturn true;}}board[i][j] = tmp; // 四个方向都不行,恢复当前格子并返回 falsereturn false;}
}