给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.
思路:此题其实是一个深度优先搜索思想,就是拿当前的字符搜索四个方向的字符看是否可以匹配下一个字符。然后以此类推匹配到下一个字符之后就可以再去搜索四个方向的字符看是否又与下一个字符匹配,但是题目说了同一个单元格的字母不能重复使用,那么可以做一步过滤,就是将当前匹配到的字符更改为 ‘*’。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if(board.empty())
return false;
int row = board.size();
int col = board[0].size();
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(board[i][j] == word[0])
{
if(isFind(board,i,j,word,1))
return true;
}
}
}
return false;
}
bool isFind(vector<vector<char>> board,int i,int j,string & word,int index)
{
if(word.size() == index)
return true;
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int row = board.size();
int col = board[0].size();
board[i][j] = '*';
for(int k=0;k<4;k++)
{
int x = i + dir[k][0];
int y = j + dir[k][1];
if(x<row && x>=0 && y<col && y>=0 && board[x][y] == word[index])
{
if(isFind(board,x,y,word,index+1))
return true;
}
}
return false;
}
};