質問:2次元グリッドと単語を指定して、単語がグリッドに存在するかどうかを調べます。
単語はアルファベット順に並べ、隣接するセルの文字で形成する必要があります。「隣接する」セルとは、水平方向または垂直方向に隣接するセルのことです。同じセル内の文字は再利用できません。
例:
board =
[
['A'、 'B'、 'C'、 'E']、
['S'、 'F'、 'C'、 'S']、
['A'、 'D'、 'E'、 'E']
]
与えられた単語= "ABCCED"、trueを返す
与えられた単語= "SEE"、trueを返す
与えられた単語= "ABCB"、falseを返す
解決策:DFSのディープ検索を実行し、2次元配列をトラバースし、ディープ検索を実行して、2次元配列の各要素を開始点として一致させます。一致が成功した場合(文字を接続して単語の内容と同じ文字列を取得できる場合)、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;
}
}