给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例给出board =
[
"ABCE",
"SFCS",
"ADEE"
]
word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,
word = "ABCB", -> 返回 false
说明:虽然这个方法通过了测试,但是还是觉得这个方法不够好,如果大家有更好的方法,还请不吝赐教。
解题思路:用走迷宫的思想。
class Solution {
public:
bool vis[1000][1000];
int row,length;
bool backtracing(vector<vector<char> >&grid,string &word,int cur,int i,int j){
if(cur==length) //递归终止条件,能走到这一步,说明已经匹配完了。
return true;
if(j>=0&&i>=0&&j<grid[i].size()&&i<row&&!vis[i][j]&&grid[i][j]==word[cur]){
vis[i][j]=true;//避免走回头路,做个标记说明
if(backtracing(grid,word,cur+1,i,j+1))//向右
return true;
if(backtracing(grid,word,cur+1,i+1,j))//向下
return true;
if(backtracing(grid,word,cur+1,i-1,j))//向上
return true;
if(backtracing(grid,word,cur+1,i,j-1))//向左
return true;
vis[i][j]=false;//记得还原
}
return false;
}
bool exist(vector<vector<char> > &board, string word) {
row=board.size();
length=word.length();
for(int i=0;i<row;++i){
int cal=board[i].size();//因为每个单词不等长,所以要计算
for(int j=0;j<cal;++j){
if(word[0]==board[i][j]){//先确定递归入口
if(backtracing(board,word,0,i,j))
return true;
}
}
}
return false;
}
};