给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
解题思路:回溯法
解题代码:
1.参考别人的代码
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m=board.size(),n=board[0].size();
if(m==0 || n==0 || word.size()==0 || m*n<word.size())
return false;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(isFound(board,word,i,j,0))
return true;
}
}
return false;
}
bool isFound(vector<vector<char>>& board,string& word,int i,int j,int pos)
{
int m=board.size();
int n=board[0].size();
if(i<0||j<0||i>=m||j>=n||board[i][j]=='\0'||board[i][j]!=word[pos])
return false;
if(pos==word.size()-1)
return true;
char t=board[i][j];
//因为写错成 board[i][j]=='\0';死活测试不通过。每一次把borad[i][j]置为空字符,是为了防止重复使用
board[i][j]='\0';
if(isFound(board,word,i,j+1,pos+1)||isFound(board,word,i+1,j,pos+1)||isFound(board,word,i-1,j,pos+1)||isFound(board,word,i,j-1,pos+1))
return true;
board[i][j]=t;
return false;
}
};
2.自己根据剑指Offer学习而写的代码(第一次写出了问题)
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int rows=board.size(),cols=board[0].size(); //这里有问题
if(board.size()<=0 || word.size()<=0 || rows*cols<word.size())
return false;
vector<int> flag(rows*cols,0);
for(int row=0;row<rows;row++)
{
for(int col=0;col<cols;col++)
{
if(CoreExist(row,rows,col,cols,board,word,flag,0))
return true;
}
}
return false;
}
private:
bool CoreExist(int row,int rows,int col,int cols,vector<vector<char>>&board,string& word,vector<int>&flag,int k)
{
//递归
if(k==word.size()-1)
return board[row][col]==word[k];
bool hasPath=false;
if(row<rows&&row>=0&&col<cols&&col>=0&&flag[row*cols+col]==0&&board[row][col]==word[k])
{
flag[row*cols+col]=1;
++k;
hasPath=CoreExist(row-1,rows,col,cols,board,word,flag,k)||CoreExist(row,rows,col-1,cols,board,word,flag,k)||CoreExist(row+1,rows,col,cols,board,word,flag,k)||CoreExist(row,rows,col+1,cols,board,word,flag,k);
if(!hasPath)
{
flag[row*cols+col]=0;
--k;
}
}
return hasPath;
}
};
3.正确理解的代码