LeetCode79-单词搜索

题目链接

英文链接:https://leetcode.com/problems/word-search/

中文链接:https://leetcode-cn.com/problems/word-search/

题目详述

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

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

示例:

1
2
3
4
5
6
7
8
9
10
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

题目详解

DFS。

  • 每次尝试匹配当前字符,从上下左右四个方向进行搜索。
  • 注意进入下一层前置访问标志为 true,本题可以直接在原数组的基础上进行等价操作,不需要额外开辟一个 vis 数组,回到本层时恢复原状即可。
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
public class LeetCode_00079 {

public boolean exist(char[][] board, String word) {
for (int i = 0; i < board.length; ++i) {
for (int j = 0; j < board[0].length; ++j) {
if (dfs(board, i, j, word, 0)) {
return true;
}
}
}
return false;
}

private boolean dfs(char[][] board, int i, int j, String word, int index) {
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != word.charAt(index)) {
return false;
}
if (index == word.length() - 1) {
return true;
}
// 相当于置访问标志为 true
board[i][j] ^= 128;
boolean flag = dfs(board, i - 1, j, word, index + 1) ||
dfs(board, i + 1, j, word, index + 1) ||
dfs(board, i, j - 1, word, index + 1) ||
dfs(board, i, j + 1, word, index + 1);
// 恢复
board[i][j] ^= 128;
return flag;
}
}