题目:给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
题解:进行DFS深搜,遍历二维数组,以二维数组的每个元素为起点进行深搜匹配,如果能匹配成功(能够连接字符得到与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[0].length;j++){
if(DFS(board,i,j,word,new boolean[board.length][board[0].length],0))
return true;
}
return false;
}
/*
* x、y用于记录当前board数组中被匹配的字符位置。
* checkPos用于记录word中被匹配的字符位置,若checkPos的值为word.length(),
* 则说明匹配成功。
* 二维数组searched用于记录元素的状态(是否被搜索)
*/
private boolean DFS(char[][]board,int x,int y,String word,boolean[][]searched,int checkPos){
if(checkPos==word.length())
return true;
else if(board[x][y]!=word.charAt(checkPos))
return false;
searched[x][y]=true;
int[][]move={
{
0,1},{
0,-1},{
1,0},{
-1,0}};
boolean result=false;
for(int[] temp:move){
int X=x+temp[0];
int Y=y+temp[1];
if(X>=0&&X<board.length&&Y>=0&&Y<board.length) {
if (!searched[X][Y]&&DFS(board, X, Y, word, searched, checkPos + 1)){
result = true;
break;
}
}
}
searched[x][y]=false;
return result;
}
}