给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
示例 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
提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
board
和word
仅由大小写英文字母组成
注意:本题与主站 79 题相同:https://leetcode-cn.com/problems/word-search/
回溯模板题了已经相当
回溯模板题了已经相当于。
- 找一个开头匹配的
- 往四个方向开始匹配下一个字符
- 中途标记已经访问过的节点
- 退出递归的时候记得要把访问过的节点标记为未访问过
class Solution {
boolean[][] visited;
char[][] board;
int[][] dist = {{1,0},{-1,0},{0,1},{0,-1}};
public boolean exist(char[][] board, String word) {
visited = new boolean[board.length][board[0].length];
this.board = board;
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
if (board[row][col] == word.charAt(0) && searchWord(word,0, row, col)){
return true;
}
}
}
return false;
}
boolean searchWord(String word, int idx, int row,int col){
if (idx == word.length()-1 && word.charAt(idx) == board[row][col]){
return true;
}
if (word.charAt(idx) != board[row][col]){
return false;
}
visited[row][col] = true;
for (int[] ints : dist) {
int x = row + ints[0];
int y = col + ints[1];
if ( x<0 || y<0 || x >= board.length || y >= board[0].length || visited[x][y] ){
continue;
}
if (searchWord(word,idx+1,x,y)){
return true;
}
}
visited[row][col] = false;
return false;
}
}