当前位置: 首页 > news >正文

Python小练习系列 Vol.6:单词搜索(网格回溯)

🧠 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 的方式:

  1. 遍历每个格子作为起点;
  2. 若当前字母匹配,就递归查找上下左右;
  3. 使用 visited 或直接标记当前格子避免重复访问;
  4. 若所有字符匹配成功,则返回 True;
  5. 若不通,则回溯,恢复现场。

👨‍💻 三、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 和剪枝在脑中“活”起来!

相关文章:

  • 测试cursor编辑器
  • Java基础 3.29
  • C++11·部分重要语法II
  • android11关机安卓充电的UI定制化
  • 练习题:110
  • Mybatis逆向工程
  • 【商城实战(94)】构建高并发的负载均衡与集群架构
  • RedHatLinux(2025.3.22)
  • 解决 macOS (M1 Pro) 上使用 Vite 进行 Build 打包时 Node 进程内存溢出的问题
  • 复现GitHub上`https://github.com/tobiasfshr/map4d`这个项目
  • Android学习总结之ContentProvider跨应用数据共享
  • 无需docker三步安装deepseek可视化操作软件-Open-WebUI
  • RabbitMQ消息相关
  • #C8# UVM中的factory机制 #S8.5# 对factory机制的重载进一步思考(二)
  • Hyperlane:Rust Web开发的未来,释放极致性能与简洁之美
  • 2025-3-29算法打卡
  • epoll 和ractor模型学习
  • Docker 的实质作用是什么
  • Blender多摄像机怎么指定相机渲染图像
  • 《数据结构:单链表》
  • “女乘客遭顺风车深夜丢高速服务区”续:滴滴永久封禁两名涉事司机账号
  • 云南铁路:打造“铁路+金融+产业”融合发展生态
  • 光明网评“泉州梦嘉商贸楼不到5年便成危楼”:监管是否尽职尽责?
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开
  • 中使馆:奉劝菲方有关人士不要在台湾问题上挑衅,玩火者必自焚
  • 一周人物|卡鲁等入围英国特纳奖,李学明新展中国美术馆