给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例给出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; } };