Hot 100 --- 单词搜索
本文概览本文以LeetCode题目单词搜索为例讲解为什么用DFS不用BFS以及DFS在二维网格中的编写套路一、题目二、题目分析这题要求在二维网格中找单词有三个要求必须从单词的第一个字符开始字符必须上下左右相邻不能跳格子同一个位置的字符不能重复使用比如要找 “ABC”网格是A C B D E F这不算因为 A 的上下左右没有 BA 的右边是 C下边是 D所以无法组成连续的 “AB”。什么是连续就是每一步只能走到上下左右相邻的格子不能跳着走。思路概览Java 实现代码如下classSolution{privateintm,n;privateboolean[][]visited;privatefinalint[][]dirs{{0,1},{0,-1},{1,0},{-1,0}};publicbooleanexist(char[][]board,Stringword){mboard.length;nboard[0].length;visitednewboolean[m][n];for(inti0;im;i){for(intj0;jn;j){if(dfs(board,word,0,i,j)){returntrue;}}}returnfalse;}privatebooleandfs(char[][]board,Stringword,intindex,inti,intj){// 1. 所有字符匹配完毕直接成功优先于越界判断if(indexword.length()){returntrue;}// 2. 越界检查if(i0||im||j0||jn){returnfalse;}// 3. 已访问或字符不匹配if(visited[i][j]||board[i][j]!word.charAt(index)){returnfalse;}// 4. 标记当前格子visited[i][j]true;// 5. 向四个方向递归for(int[]dir:dirs){if(dfs(board,word,index1,idir[0],jdir[1])){visited[i][j]false;returntrue;}}// 6. 回溯visited[i][j]false;returnfalse;}}思路简要说明外层双重循环遍历每个格子作为起点调用 DFS 尝试匹配DFS 内部先判断出口匹配完成、越界、字符不匹配再标记当前格子向四方向递归最后回溯用一个visited数组记录已访问的格子回溯时恢复为false三、思路详解第一步为什么用 DFS 不用 BFS这题和前面的岛屿数量很像都是二维网格 四方向递归。岛屿数量用 DFS 或 BFS 都行但这题强烈推荐 DFS不推荐 BFS。为什么因为 BFS 需要记录每条路径的访问状态。举个例子假设从 A 出发走到 B 后有两条路路径1A → B → C → ... 路径2A → B → D → ...如果用 BFS队列里会同时存在这两条路径。路径1 访问了 C路径2 访问了 D它们的visited状态是不同的——路径1 不能再用 C路径2 不能再用 D但两条路径都不能用 A 和 B。如果用一个全局visited路径1 标记了 C路径2 就看不到 C 了但路径2 可能本来是可以走 C 的只是路径1 先走了。所以 BFS 要么给每个队列元素配一个独立的visited副本空间开销大要么用更复杂的状态记录方式代码复杂。而 DFS 就简单多了一个全局visited数组走到哪标记到哪走不通就回溯恢复。同一时刻只有一条路径在走visited状态天然就是当前路径的访问记录。第二步DFS 编写套路和岛屿数量对比这题的 DFS 框架和岛屿数量几乎一样// 岛屿数量的 DFSprivatevoiddfs(char[][]grid,inti,intj){if(越界||grid[i][j]0)return;grid[i][j]0;// 标记for(int[]dir:dirs){dfs(grid,idir[0],jdir[1]);}}// 单词搜索的 DFSprivatebooleandfs(char[][]board,Stringword,intindex,inti,intj){if(indexword.length())returntrue;// 匹配完成if(越界||visited[i][j]||board[i][j]!word.charAt(index))returnfalse;visited[i][j]true;// 标记for(int[]dir:dirs){if(dfs(board,word,index1,idir[0],jdir[1]))returntrue;}visited[i][j]false;// 回溯returnfalse;}区别在于岛屿数量单词搜索目标标记整个岛屿找到一条匹配路径标记方式直接改grid[i][j] 0用visited数组回溯不需要标记完就不管了需要走不通要恢复返回值voidboolean第三步递归出口的三个判断DFS 函数开头有三个判断顺序很重要// 1. 所有字符匹配完毕直接成功if(indexword.length()){returntrue;}// 2. 越界检查if(i0||im||j0||jn){returnfalse;}// 3. 已访问或字符不匹配if(visited[i][j]||board[i][j]!word.charAt(index)){returnfalse;}为什么index word.length()要放在最前面因为当index到达word.length()时说明所有字符都匹配完了此时i, j可能是越界的最后一个字符的下一个位置。如果先判断越界就会错误地返回false。举个例子单词 “AB”网格是A B匹配流程dfs(0, 0)board[0][0] A匹配标记递归dfs(0, 1)dfs(0, 1)board[0][1] B匹配标记递归dfs(0, 2)dfs(0, 2)index 2 word.length()返回true如果先判断越界dfs(0, 2)会因为j n返回false就错了。第四步标记 四方向递归 回溯匹配成功后标记当前格子向四方向递归visited[i][j]true;// 标记for(int[]dir:dirs){if(dfs(board,word,index1,idir[0],jdir[1])){visited[i][j]false;// 找到即返回也恢复一下returntrue;}}visited[i][j]false;// 回溯returnfalse;为什么要回溯因为当前路径走不通要退回去尝试其他路径。如果不恢复visited[i][j] false其他路径就看不到这个格子了。举个例子从 A 出发先往右走 B再往右走 C发现 C 的下一个字符不匹配回溯。此时 A 还要尝试往下走如果 B 没有被恢复A 往下走的路径就看不到 B 了虽然这条路径本来也不经过 B但visited状态是全局的。第五步完整执行过程以示例为例board [ [A, B, C, E], [S, F, C, S], [A, D, E, E] ] word ABCCED外层循环从(0, 0)开始board[0][0] A匹配word[0]开始 DFS。最终找到的路径在网格上长这样0 1 2 3 ┌───┬───┬───┬───┐ 0 │ A→│ B→│ C │ E │ ├───┼───┼───┼───┤ │ │ │ ↓ │ │ 1 │ S │ F │ C │ S │ ├───┼───┼───┼───┤ │ │ ← │ │ │ 2 │ A │ D │ E │ E │ └───┴───┴───┴───┘路径(0,0)→(0,1)→(0,2)→(1,2)→(2,2)→(2,1)对应字符 “ABCCED”。下面用表格展示每一步的状态变化步骤当前位置字符匹配 word 的哪个字符下一步尝试结果1(0,0)Aword[0]向右到 (0,1)继续2(0,1)Bword[1]向右到 (0,2)继续3(0,2)Cword[2]向右到 (0,3)E≠C失败回溯4(0,2)Cword[2]向下到 (1,2)继续5(1,2)Cword[3]向右到 (1,3)S≠E失败回溯6(1,2)Cword[3]向下到 (2,2)继续7(2,2)Eword[4]向右到 (2,3)E≠D失败回溯8(2,2)Eword[4]向左到 (2,1)继续9(2,1)Dword[5]index6word.length()成功注意第 3 步和第 4 步在 (0,2) 这个位置先尝试向右走发现不匹配回溯后再尝试向下走。这就是 DFS 的回溯机制——一条路走不通就退回来换一条路。第六步DFS vs BFS 对比DFSBFS数据结构递归栈队列visited一个全局数组每个路径需要独立副本回溯天然支持递归返回时恢复需要额外处理空间复杂度O(mn L)L 是单词长度O(mn × 路径数)代码复杂度简单复杂这题用 DFS 是标准做法BFS 虽然理论上可行但实现起来麻烦且效率低。四、总结这题和岛屿数量一样都是二维网格 四方向递归核心区别在于岛屿数量不需要回溯标记完就不管了单词搜索需要回溯走不通要恢复岛屿数量用 DFS 或 BFS 都行单词搜索强烈推荐 DFSBFS 的 visited 管理太复杂DFS 的编写套路判断出口匹配完成、越界、字符不匹配标记当前格子四方向递归回溯恢复这个套路适用于所有在网格中找路径的题目。

相关新闻

终极指南:如何在浏览器中免费制作专业EPUB电子书

终极指南:如何在浏览器中免费制作专业EPUB电子书

终极指南:如何在浏览器中免费制作专业EPUB电子书 【免费下载链接】EPubBuilder 一款在线的epub格式书籍编辑器 项目地址: https://gitcode.com/gh_mirrors/ep/EPubBuilder 还在为制作电子书而烦恼吗?EPubBuilder是一款革命性的在线EPUB编辑器&…

2026/8/1 9:43:17阅读更多 →
显卡驱动彻底清理:DDU完整教程与避坑指南

显卡驱动彻底清理:DDU完整教程与避坑指南

显卡驱动彻底清理:DDU完整教程与避坑指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 当你的电…

2026/8/1 9:43:17阅读更多 →
集团发文〔2026〕第 17 号:关于规范全集团大模型调用管理的通知

集团发文〔2026〕第 17 号:关于规范全集团大模型调用管理的通知

集团数字化与信息安全委员会 签发人:信息化主管副总裁 主送:各中心、各子公司信息化与财务负责人一、背景近期审计与财务核查发现,集团大模型 API 调用存在 Key 散落、账单无法分摊、敏感数据外传等风险,个别中心月支出异常增长达…

2026/8/1 9:41:17阅读更多 →
从命令行到可视化:N_m3u8DL-CLI-SimpleG如何重新定义流媒体下载体验

从命令行到可视化:N_m3u8DL-CLI-SimpleG如何重新定义流媒体下载体验

从命令行到可视化:N_m3u8DL-CLI-SimpleG如何重新定义流媒体下载体验 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为复杂的M3U8命令行参数而头疼吗?…

2026/8/1 10:45:42阅读更多 →
终极指南:如何用大气层整合包轻松破解你的Nintendo Switch

终极指南:如何用大气层整合包轻松破解你的Nintendo Switch

终极指南:如何用大气层整合包轻松破解你的Nintendo Switch 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 还在为Nintendo Switch破解的复杂操作感到困惑吗?大气层整…

2026/8/1 10:45:42阅读更多 →
USB转SATA硬盘盒原理与选购指南:从协议转换到数据安全

USB转SATA硬盘盒原理与选购指南:从协议转换到数据安全

1. 项目概述:从“USB TO SATA”说起,一个看似简单却暗藏玄机的转换世界如果你手头有一块闲置的2.5寸或3.5寸硬盘,想把它变成移动硬盘,或者你的老旧电脑主板SATA接口损坏,急需外接硬盘救急,那么“USB TO SAT…

2026/8/1 10:45:42阅读更多 →
USB-CAN-B硬件方案与固件开发全解析:从核心芯片选型到实战应用

USB-CAN-B硬件方案与固件开发全解析:从核心芯片选型到实战应用

1. 项目概述:从串口到CAN总线的桥梁如果你在汽车电子、工业控制或者机器人领域工作,那么“CAN总线”这个词对你来说一定不陌生。它是一种在嘈杂的工业环境中依然能稳定通信的“神经系统”。但很多时候,我们手头只有一台普通的笔记本电脑&…

2026/8/1 10:45:42阅读更多 →
OpenCore Legacy Patcher实战宝典:让旧款Mac重获新生的终极秘籍

OpenCore Legacy Patcher实战宝典:让旧款Mac重获新生的终极秘籍

OpenCore Legacy Patcher实战宝典:让旧款Mac重获新生的终极秘籍 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方放弃支持的老旧Mac…

2026/8/1 10:45:42阅读更多 →
计算机毕业设计之基于SpringBoot+Vue的公益捐赠系统的设计与实现

计算机毕业设计之基于SpringBoot+Vue的公益捐赠系统的设计与实现

随着大数据、人工智能的快速发展,传统的手工管理方式已难以满足现代用户的需求。为了提升工作效率、优化用户体验并降低运营成本,本研究设计并实现了一套基于Spring Boot的公益捐赠系统。该系统充分利用Spring Boot框架的简洁性、高效性和易用性&#xf…

2026/8/1 10:43:42阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →