79. 单词搜索
题目描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
思想:
深度优先搜索
对于 word = ABCCEE,可以先采用暴力搜索的办法找到目标字符串 word 中的第一个字符 A,找到之后按照深度优先搜索的顺序寻找是否有和 word 匹配的字符串,如果找到直接返回 True;如果没有,继续寻找下一个 A...
参考:
https://leetcode-cn.com/problems/word-search/solution/tu-jie-di-gui-shen-du-you-xian-sou-suo-by-z1m/
代码:
class Solution { public: bool exist(vector<vector<char>>& board, string word) { if(board.size()==0) return false; for(int i=0;i<board.size();i++) for(int j=0;j<board[0].size();j++){ if(dfs(board,word,i,j,0)) return true; } return false; } bool dfs(vector<vector<char>>& board, string& word, int i, int j, int length){ if(i<0||j<0||i>=board.size()||j>=board[0].size()||length>=word.size()||board[i][j]!=word[length]) return false; if(length==word.size()-1&&word[length]==board[i][j]) return true; char tmp = board[i][j]; board[i][j] = '0'; bool flag=dfs(board,word,i+1,j,length+1)||dfs(board,word,i,j+1,length+1)||dfs(board,word,i-1,j,length+1)||dfs(board,word,i,j-1,length+1); board[i][j] = tmp; return flag; } };