题目描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
思路:这道题目其实就是按照字母顺序,在board矩阵中查找是否存在一条这样的路径,所以需要采用DFS的方式按照上下左右(具体顺序可以更换)的顺序进行查找。
class Solution {
public:
bool DFS(int x,int y,vector<vector<bool>> &visited,vector<vector<char>>& board,string word,int num){
if(num==word.size())//两个if的顺序很重要,先判断是否到达末尾
return true;
//位置合法性的判断
if(x<0||x>=row||y<0||y>=col||visited[x][y]||board[x][y]!=word[num])//这里需要用到word[num],所以对于num的判断应该放在前面
return false;
visited[x][y]=true;
//*****四个方向,只要有一个方向成功,则能走通
if(DFS(x+1,y,visited,board,word,num+1)||DFS(x-1,y,visited,board,word,num+1)||DFS(x,y+1,visited,board,word,num+1)||DFS(x,y-1,visited,board,word,num+1))
return true;
visited[x][y]=false;//重置,用于下一次DFS
return false;
}
bool exist(vector<vector<char>>& board, string word) {
row=board.size();
col=board[0].size();
vector<vector<bool>> visited(row,vector<bool>(col,false));
//按照图的查找方式需要遍历所有的元素
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]==word[0]){//找出起点
bool flag=DFS(i,j,visited,board,word,0);
if(flag)
return flag;
}
}
}
return false;
}
private:
int row;
int col;
};