79.单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
思路
这题目比较简单,之前写了很多dfs的题目了,这一看就是套模板的题目。
void dfs(int step)
{
if(满足终止搜索条件)
{
终止搜索,记录数据;
return;
}
尝试每一种搜索可能
{
if(不满足继续搜索的条件)
{
跳过这一种搜索可能;
}
记录搜索数据;
继续下一步dfs(step+1);
恢复初始状态(回溯的时候要用到);
}
}
对应的实现代码
class Solution {
boolean res = false;
public boolean exist(char[][] board, String word) {
for(int i = 0; i < board.length; i++)
{
for(int j = 0; j < board[0].length; j++)
{
if(board[i][j] == word.charAt(0))
{
dfs(-1,board,i,j,0,word);
if(this.res == true)
{
return true;
}
}
}
}
return false;
}
void dfs(int flag,char[][] board,int i,int j,int indexOfWord,String word)
{
/*满足终止搜索条件*/
if(indexOfWord > word.length() - 1 || this.res == true)
{
this.res = true;//终止搜索记录数据
return;
}
//尝试各种情况
for(int k = 0; k < 4; k++)//上下左右
{
//不满足搜索条件
if(flag == k || i < 0 || i >= board.length || j < 0 || j >= board[0].length)
{
continue;
}
//不满足搜索条件
if(word.charAt(indexOfWord) != board[i][j])
{
continue;
}
//记录数据
char temp = board[i][j];
board[i][j] = '?';//这里是为了不重复使用同一个位置的字节
indexOfWord++;
//下一步dfs
switch (k)
{
case 0:
dfs(1,board,i,j - 1,indexOfWord,word);
break;
case 1:
dfs(0,board,i,j + 1,indexOfWord,word);
break;
case 2:
dfs(3,board,i - 1,j,indexOfWord,word);
break;
case 3:
dfs(2,board,i + 1,j,indexOfWord,word);
break;
}
//恢复状态,回溯
board[i][j] = temp;
indexOfWord--;
}
}
}