基本思想:
直接递归,但是自己写的很冗余;
以后可以用原二维数组修改进行判定;
具体代码:
冗余版本;
vector<vector<int>>dir={{0,-1},{-1,0},{0,1},{1,0}};
void dfs(int m,int n,vector<vector<bool>>& visit,vector<vector<char>>& board,string word,int index,bool& flag,int x,int y){
if(word.size()-1==index){
flag=true;
return;
}
for(int i=0;i<4;i++){
int newx=x+dir[i][0];
int newy=y+dir[i][1];
if(!flag&&newx>=0&&newx<m&&newy>=0&&newy<n&&board[newx][newy]==word[index+1]&&visit[newx][newy]){
visit[newx][newy]=false;
dfs(m,n,visit,board,word,index+1,flag,newx,newy);
visit[newx][newy]=true;
}
}
}
bool exist(vector<vector<char>>& board, string word) {
bool flag= false;
int m=board.size();
int n=board[0].size();
vector<vector<bool>>visit(m,vector<bool>(n,1));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(flag)
return true;
if(board[i][j]==word[0]){
visit[i][j]=false;
dfs(m,n,visit,board,word,0,flag,i,j);
visit[i][j]=true;
}
}
}
return flag;
}
升级版:
class Solution {
public:
bool dfs(int m,int n,vector<vector<char>>& board,string word,int index,int x,int y){
if(x<0||x>=m||y<0||y>=n||word[index]!=board[x][y])
return false;
if(index==word.size()-1)
return true;
board[x][y]='-1';
bool ret=dfs(m,n,board,word,index+1,x+1,y)||dfs(m,n,board,word,index+1,x,y-1)||dfs(m,n,board,word,index+1,x,y+1)||dfs(m,n,board,word,index+1,x-1,y);
board[x][y]=word[index];
return ret;
}
bool exist(vector<vector<char>>& board, string word) {
int m=board.size();
int n=board[0].size();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(dfs(m,n,board,word,0,i,j))
return true;
}
}
return false;
}
};