题目:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
思路:
类似图的深度遍历,按照题目的意思,从==word[0]的格子开始深度搜索,当定位到一个格子(i, j)时,下次遍历可以向上下左右四个方向遍历,若当前格子符合条件,则继续深度搜索,当不符合条件就回溯返回false,直到遍历深度==word.len(),依层返回true。所以条件如下:
1、搜索到结果,返回true
2、不满足条件(下标越界、该格子已经出现在线路中、该层与word不匹配),返回false
3、继续朝四个方向深度搜索
bool search(vector<vector<char>>& board, string word, int i, int j, int count, vector<vector<bool>> &used){
//搜索到结果
if(count == word.size()) //其实这里下标已经超过了
return true;
//不满足条件
if(i < 0 || j < 0 || i == board.size() || j == board[0].size() || used[i][j] || board[i][j] != word[count])
return false;
//上下左右分别递归
if(!used[i][j] && board[i][j] == word[count]){
used[i][j] = true;
bool res = search(board, word, i - 1, j, count + 1, used) ||
search(board, word, i + 1, j, count + 1, used) ||
search(board, word, i, j - 1, count + 1, used) ||
search(board, word, i, j + 1, count + 1, used);
used[i][j] = false;
return res;
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
//初始化used
vector<vector<bool>> used;
for(int i = 0; i < board.size(); i++){
used.emplace_back();
for(int j = 0; j < board[i].size(); j++){
used[i].push_back(false);
}
}
for(int i = 0; i < board.size(); i++){
for(int j = 0; j < board[i].size(); j++){
if(board[i][j] == word[0]){
if(search(board, word, i, j, 0, used))
return true;
}
}
}
return false;
}