单词搜索(Word Search)
📌 定义
给定一个 m×n 的二维字符网格 board 和一个字符串单词 word。如果 word 存在于网格中,返回 true;否则,返回 false。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中”相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
word = "ABCCED" → true
word = "SEE" → true
word = "ABCB" → false
核心思路
使用回溯 + DFS在网格中搜索单词:
- 选择:从当前位置向四个方向探索
- 约束:字符匹配且未访问过
- 探索:递归搜索下一个字符
- 撤销:标记为未访问,尝试其他路径
搜索"SEE"的过程:
S → E → E
↓ ↓ ↓
找S 找E 找E
复杂度分析
| 指标 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(m×n×4^L) | L是单词长度 |
| 空间复杂度 | O(L) | 递归栈深度 |
Go 代码
Go 实现
func exist(board [][]byte, word string) bool {
m, n := len(board), len(board[0])
var backtrack func(i, j, k int) bool
backtrack = func(i, j, k int) bool {
if k == len(word) {
return true
}
if i < 0 || i >= m || j < 0 || j >= n ||
board[i][j] != word[k] {
return false
}
temp := board[i][j]
board[i][j] = '#'
found := backtrack(i+1, j, k+1) ||
backtrack(i-1, j, k+1) ||
backtrack(i, j+1, k+1) ||
backtrack(i, j-1, k+1)
board[i][j] = temp
return found
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if backtrack(i, j, 0) {
return true
}
}
}
return false
}思路展开
搜索过程详解
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
搜索 "ABCCED":
从(0,0)开始:
A(0,0) → B(0,1) → C(0,2) → C(1,2) → E(2,2) → D(2,1)
✓ 找到完整路径
标记访问过程:
A → B → C → C → E → D
# # # # # #