给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,’B’,’C’,’E’],
[‘S’,’F’,’C’,’S’],
[‘A’,’D’,’E’,’E’]
]
给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1:DFS
direction保存点行进的方向
创建used记录该点是否访问过,然后进行dfs遍历,每次判断该点board==word对应字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { private: vector<vector<char>> board; string word; vector<vector<bool>> used; int n; int m; int wordlen; int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; public: bool exist(vector<vector<char>>& board, string word) { n=board.size(); if(n==0) return false; m=board[0].size(); vector<vector<bool>> used(n,vector<bool>(m,false)); this->board=board; this->word=word; this->used=used; this->wordlen=word.size(); int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(dfs(i,j,0)) return true; } } return false; } bool dfs(int i,int j,int len) { if(len>=wordlen-1) return board[i][j]==word[len]; if(board[i][j]==word[len]) { used[i][j]=true; for(int k=0;k<4;k++) { int newx=i+direction[k][0]; int newy=j+direction[k][1]; if(newx>=0&&newx<n&&newy>=0&&newy<m&&!used[newx][newy]) { if(dfs(newx,newy,len+1)) return true; } } used[i][j]=false; } return false; } };
|