🧠 Python小练习系列 Vol.6:单词搜索(网格回溯)
🔍 本期我们来挑战一道 LeetCode 上经典的网格型回溯题 —— 单词搜索,考察对 DFS + 状态恢复的掌握!
🧩 一、题目描述
给定一个 m x n
的二维字母网格 board
和一个字符串 word
,判断 word
是否存在于网格中。
规则:
- 单词可以从任意一个单元格开始,
- 每次可以向上下左右相邻单元格移动一格,
- 不能重复使用同一个格子。
示例:
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
word = "ABCCED"
输出:True
(存在该路径)
🧠 二、解题思路
采用 回溯 + DFS 的方式:
- 遍历每个格子作为起点;
- 若当前字母匹配,就递归查找上下左右;
- 使用 visited 或直接标记当前格子避免重复访问;
- 若所有字符匹配成功,则返回 True;
- 若不通,则回溯,恢复现场。
👨💻 三、Python代码实现
def exist(board, word):
rows, cols = len(board), len(board[0])
def dfs(x, y, k):
if not (0 <= x < rows and 0 <= y < cols):
return False
if board[x][y] != word[k]:
return False
if k == len(word) - 1:
return True
temp = board[x][y]
board[x][y] = "#" # 标记访问
for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]:
if dfs(x + dx, y + dy, k + 1):
return True
board[x][y] = temp # 恢复状态
return False
for i in range(rows):
for j in range(cols):
if dfs(i, j, 0):
return True
return False
📌 四、运行示例
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
print(exist(board, "ABCCED")) # True
print(exist(board, "SEE")) # True
print(exist(board, "ABCB")) # False
🧩 五、解题小结
步骤 | 说明 |
---|---|
DFS 搜索 | 遇到首字符匹配即深度探索 |
标记已访问 | 避免重复走,使用替代标记 “#” |
回溯复原 | 走不通要恢复现场,避免干扰下一次探索 |
💡 六、进阶思考
- 🧠 如果要输出路径坐标,如何修改?
- 🚀 如何同时查找多个单词?(提示:使用 Trie)
- 📦 多个路径同时存在时,如何全部找出?
❤️ 结语
这是经典的「网格 + 回溯 + 剪枝」组合题,掌握后能打通很多迷宫类、图遍历类题目思维路径!
📌 下一期预告:全排列生成(回溯算法模板题)
👉 点个赞 👍 + 收藏 🌟,让 DFS 和剪枝在脑中“活”起来!