题目
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
算法
采用dfs+回溯的思想
从二维网格的每一个点依次开始,进行dfs,如果成功则返回true
不成功则回溯一步
代码
class Solution {
private:
int marked[200][200];
int len,m,n;
string word;
vector<vector<char>> board;
bool ans;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
public:
bool exist(vector<vector<char>>& board, string word) {
m=board.size();
n=board[0].size();
len=word.size();
this->word=word;
this->board=board;
ans=false;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
dfs(i,j,0);
if(ans==true)
return ans;
}
return ans;
}
void dfs(int x,int y,int index){
if(board[x][y]==word[index]){
if(index==len-1){
ans=true;
return;
}
marked[x][y]=1;
for(int i=0;i<4;i++)
if(x+dir[i][0]>=0&&x+dir[i][0]<m&&y+dir[i][1]>=0&&y+dir[i][1]<n&&
marked[x+dir[i][0]][y+dir[i][1]]==0){
dfs(x+dir[i][0],y+dir[i][1],index+1);
if(ans==true)
return ;
}
marked[x][y]=0;
}
}
};