题目描述 给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
解答 确定开头,然后深搜
class Solution {
public:
int ss[500][500]={0};
bool search(int i, int j , int le,string s,vector<vector<char>>& board)
{
if (le==s.length()-1) return true;
int r[4]={-1,0,1,0}, l[4]={0,1,0,-1};
for (int k=0; k<4; k++)
{
if(i+r[k]>=0 && i+r[k]<board.end()-board.begin() && j+l[k]>=0 && j+l[k]<board[0].end()-board[0].begin())
{
auto a=board.begin()+i+r[k];
auto b=(*a).begin()+j+l[k];
if (*b==s[le+1] && ss[i+r[k]][j+l[k]]==0)
{
ss[i+r[k]][j+l[k]]=1;
if (search(i+r[k],j+l[k],le+1,s,board))
return true;
else
ss[i+r[k]][j+l[k]]=0;
}
}
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
for(auto i=board.begin(); i!=board.end(); i++)
{
for (auto j=(*i).begin(); j!=(*i).end(); j++)
{
if ((*j)==word[0])
{
ss[i-board.begin()][j-(*i).begin()]=1;
if (search(i-board.begin(),j-(*i).begin(),0,word,board))
return true;
else
ss[i-board.begin()][j-(*i).begin()]=0;
}
}
}
return false;
}
};
BUG
1.不可重复搜索