Leetcode-79.单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

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;
}
};