题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.
思路
这道题,可以从矩阵的任意位置开始,向上、向下、向左、向友移动来构造单词。
这里使用深度优先搜索+回溯的思路。
使用一个同等大小的矩阵flag来表示单词是否使用过,因为题目中要求每个单词只能使用一次。
解答
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int row=board.size(),column=board[0].size();
vector<vector<bool>> flag(row,vector<bool>(column,0));
for(int i=0;i<row;++i)
{
for(int j=0;j<column;++j)
{
if(word[0]==board[i][j])
{
flag[i][j]=1;
if(dfs(board,word,flag,i,j,0)) return true;
flag[i][j]=0;
}
}
}
return false;
}
bool dfs(const vector<vector<char>> &board, const string &word, vector<vector<bool>> flag, int i, int j, int index)
{
if(index==word.size()-1) return true;
//向上搜索
if(i-1>=0 && board[i-1][j]==word[index+1] && flag[i-1][j]!=true)
{
flag[i-1][j]=true;
if(dfs(board,word,flag,i-1,j,index+1)) return true;
flag[i-1][j]=false;
}
//向下搜索
if(i+1<board.size() && board[i+1][j]==word[index+1] && flag[i+1][j]!=true)
{
flag[i+1][j]=true;
if(dfs(board,word,flag,i+1,j,index+1)) return true;
flag[i+1][j]=false;
}
//向左搜索
if(j-1>=0 && board[i][j-1]==word[index+1] && flag[i][j-1]!=true)
{
flag[i][j-1]=true;
if(dfs(board,word,flag,i,j-1,index+1)) return true;
flag[i][j-1]=false;
}
//向右搜索
if(j+1<board[0].size() && board[i][j+1]==word[index+1] && flag[i][j+1]!=true)
{
flag[i][j+1]=true;
if(dfs(board,word,flag,i,j+1,index+1)) return true;
flag[i][j+1]=false;
}
return false;
}
};