中等
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
这题类似迷宫,一开始就想到回溯,可是不知道递归结束的标准是什么,看了评论,是用一个变量标记是否找到,如果找到了就停止寻找,如果没有,就一直找,直到所有点都被当做过起点。要注意查找失败时的多个情况,失败时回退,成功时,继续往下找,且要把当前格子标记为已经走过了,回溯时,再标记为没有走过。
class Solution {
public:
int flag[6][6];
int yes=false;
void find(vector<vector<char>>& board, string word,int i,int j,int satrt){
if(satrt==word.size() || yes){
yes=true;
return;
}
int m=board.size();
int n=board[0].size();
if(i<0 || j<0 || i>m-1 || j>n-1 || word[satrt]!=board[i][j] || flag[i][j])
return;
flag[i][j]=1;
find(board,word,i+1,j,satrt+1);
find(board,word,i,j+1,satrt+1);
find(board,word,i-1,j,satrt+1);
find(board,word,i,j-1,satrt+1);
flag[i][j]=0;
return;
}
bool exist(vector<vector<char>>& board, string word) {
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
find(board,word,i,j,0);
}
}
return yes;
}
};