题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
来源,leetcode 每日一题 79. 单词搜索
例如:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
解题思路
- 回溯(dfs)
- 每次失败回溯的时候,需要重置一下已经遍历过的节点
代码
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
bool answer = false;
int w = board[0].size(), h = board.size();
vector<vector<int>> attach(h, vector<int>(w));
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
dfs(board, attach, word, j, i, answer, 0);
if (answer) {
return answer;
}
}
}
return answer;
}
void dfs(vector<vector<char>>& board, vector<vector<int>>& attach, string word, int i, int j, bool& answer, int index) {
if (board[j][i] != word[index]) {
return;
} else if (index == word.length() - 1) {
answer = true;
return;
}
attach[j][i] = true;
// 如果相等,探查其周围的情况
if (j < attach.size() - 1 && attach[j + 1][i] == false) {
dfs(board, attach, word, i, j + 1, answer, index + 1);
}
if (answer) {
attach[j][i] = false;
return;
}
if (j > 0 && attach[j - 1][i] == false) {
dfs(board, attach, word, i, j - 1, answer, index + 1);
}
if (answer){
attach[j][i] = false;
return;
}
if (i < attach[j].size() -1 && attach[j][i + 1] == false) {
dfs(board, attach, word, i + 1, j, answer, index + 1);
}
if (answer) {
attach[j][i] = false;
return;
}
if (i > 0 && attach[j][i - 1] == false) {
dfs(board, attach, word, i - 1, j, answer, index + 1);
}
attach[j][i] = false;
}
};