力扣 79. 单词搜索

题目说明

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

示例

示例 1:

img

1
2
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

img

1
2
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

img

1
2
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

笔者理解

此题是一道字符串算法问题,在力扣题库中被定义为中等题。

解法

当笔者阅读完此题后,发现我们直接DFS进行判断即可,让我们来看看具体如何实现的吧。

实现

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class Solution {
/**
* DFS
*/

// 转向
int[] turnX = {-1, 1, 0, 0};
int[] turnY = {0, 0, -1, 1};

int m, n;

public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();

m = board.length;
n = board[0].length;

boolean[][] ticks = new boolean[m][n];

for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == words[0]) {
ticks[i][j] = true;
if (dfs(board, words, 1, i, j, ticks)) {
return true;
}
ticks[i][j] = false;
}
}
}

return false;
}

/**
* DFS
*/
public boolean dfs(char[][] board, char[] words, int now, int i, int j, boolean[][] ticks) {
// 已经匹配完成
if (now == words.length) {
return true;
}

boolean result = false;

for (int k = 0; k < 4; k++) {
i += turnX[k]; j += turnY[k];

// 不符合要求排除
if (!judge(i, j) && !ticks[i][j] && board[i][j] == words[now]) {
ticks[i][j] = true;
result |= dfs(board, words, now + 1, i, j, ticks);
ticks[i][j] = false;
}

i -= turnX[k]; j -= turnY[k];
}

return result;
}

/**
* 判断下标是否越界
*/
public boolean judge(int i, int j) {
return i < 0 || j < 0 || (i - m) * (j - n) <= 0;
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20211011230603362

总结

本题是今天的一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。