题目
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
代码实现
搜索回溯法
class Solution {
public boolean exist(char[][] board, String word) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (board[i][j] == word.charAt(0) && backtrack(board,i,j,word,0)){
return true;
}
}
}
return false;
}
public boolean backtrack(char[][] board,int i,int j,String word,int index){
//整个单词都被遍历过了,自然就符合条件
if(index == word.length()){
return true;
}
//防止越界
if (i < 0 || i == board.length || j < 0 || j == board[0].length){
return false;
}
//剪枝
if (board[i][j] != word.charAt(index)){
return false;
}
char t = board[i][j];
board[i][j] = '`';
//上下左右搜索
boolean res = backtrack(board,i-1,j,word,index+1) || backtrack(board,i+1,j,word,index+1)
||backtrack(board,i,j-1,word,index+1)||backtrack(board,i,j+1,word,index+1);
board[i][j] = t;
return res;
}
}