题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
来源,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;}};
