描述:
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路:
-
遍历网格,找到
word[0]
的起始位置。 -
用 DFS 搜索四个方向(上下左右),匹配
word
的后续字符。 -
回溯(Backtracking):
-
避免重复使用同一个单元格。
-
如果匹配失败,撤销当前选择。
-
代码:
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
m, n = len(board), len(board[0])
def dfs(x, y, index):
# 终止条件:找到完整单词
if index == len(word):
return True
# 越界 or 不匹配
if x < 0 or x >= m or y < 0 or y >= n or board[x][y] != word[index]:
return False
# 标记当前单元格(避免重复使用)
temp, board[x][y] = board[x][y], "#"
# 递归搜索四个方向
found = (dfs(x+1, y, index+1) or
dfs(x-1, y, index+1) or
dfs(x, y+1, index+1) or
dfs(x, y-1, index+1))
# 恢复现场(回溯)
board[x][y] = temp
return found
# 遍历整个网格,寻找起点
for i in range(m):
for j in range(n):
if dfs(i, j, 0):
return True
return False
示例:
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
word = "ABCCED"
从 board[0][0] = 'A' 开始匹配 word[0] = 'A'。
递归向右搜索 'B' -> 'C' -> 'C' -> 'E' -> 'D',成功找到 word = "ABCCED"。
复杂度分析:
-
时间复杂度:
O(m * n * 4^k)
,m*n
遍历整个网格,4^k
为 DFS 递归深度(k
为word
长度)。 -
空间复杂度:
O(k)
,递归栈深度最多k
。