LeetCode 79. 单词搜索
题目描述给定一个m x n的二维字符网格board和一个字符串word。如果word存在于网格中返回true否则返回false。单词必须按照字母顺序通过相邻单元格中的字母构成。相邻单元格指水平相邻或垂直相邻的格子。同一个单元格内的字母不允许被重复使用。例如输入 board [ [A,B,C,E], [S,F,C,S], [A,D,E,E] ] word ABCCED 输出true初始思路这道题第一眼可以想到 DFS。从某个格子出发如果当前字符能匹配word中的某一位就继续向上下左右四个方向搜索下一个字符。也就是当前位置匹配 word[k] 然后去相邻位置匹配 word[k 1]不过这里有两个关键限制1. 单词不一定从 board[0][0] 开始 2. 同一个格子在同一条路径里不能重复使用这两个点如果漏掉DFS 的方向虽然对但结果会出错。解题思路定义 DFS 函数dfs(i, j, k)含义是当前格子 board[i][j] 要匹配 word[k]所以进入 DFS 后第一步就是判断当前格子是否匹配当前字符如果 board[i][j] ! word[k]说明这条路径不成立直接返回如果当前字符已经是最后一个字符k word.length - 1并且当前格子已经匹配成功那么说明整个单词已经找到可以返回true。接下来需要处理访问标记。因为同一个格子不能在同一条路径中重复使用所以当前格子匹配成功后要先标记为已经访问visited[i][j] true然后枚举上下左右四个方向。如果下一个位置没有越界并且没有在当前路径中被访问过就继续递归搜索。四个方向都搜索完之后要恢复当前格子的访问状态visited[i][j] false这就是典型的回溯做选择 递归搜索 撤销选择代码实现class Solution { int[][] D new int[][] { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; int m; int n; boolean ans; public boolean exist(char[][] board, String word) { m board.length; n board[0].length; ans false; char[] w word.toCharArray(); boolean[][] flag new boolean[m][n]; for (int i 0; i m; i) { for (int j 0; j n; j) { if (board[i][j] w[0]) { dfs(i, j, 0, board, w, flag); } } } return ans; } public void dfs(int i, int j, int k, char[][] board, char[] word, boolean[][] flag) { if (ans) return; if (board[i][j] ! word[k]) { return; } if (k word.length - 1) { ans true; return; } flag[i][j] true; for (int[] d : D) { int x i d[0]; int y j d[1]; if (x 0 x m y 0 y n !flag[x][y]) { dfs(x, y, k 1, board, word, flag); } } flag[i][j] false; } }为什么这样写这题的搜索不是从固定位置开始而是从任意格子开始。所以外层必须枚举整个网格for (int i 0; i m; i) { for (int j 0; j n; j) { if (board[i][j] w[0]) { dfs(i, j, 0, board, w, flag); } } }如果只从(0,0)开始就会漏掉这种情况board [ [A,B], [C,D] ] word CD答案应该是true因为可以从C开始搜索。flag的作用是记录当前路径中已经使用过的格子。比如board [[A,B]] word ABA如果不加访问标记路径可能会变成A - B - A但这个A是同一个格子被重复使用了不符合题意。所以递归进入当前格子后要标记flag[i][j] true;递归结束后要恢复flag[i][j] false;恢复的原因是当前路径搜索完之后其他路径仍然可以重新使用这个格子。易错点1. 只从(0,0)开始搜索错误思路是直接写dfs(0, 0, 0, board, word);这样默认单词一定从左上角开始会漏掉很多合法答案。正确做法是枚举每个格子作为起点。2.if后面误加分号错误写法if (board[i][j] w[0]); dfs(i, j, 0, board, w, flag);这个分号会让if变成空语句导致dfs不受条件控制每个格子都会执行。正确写法if (board[i][j] w[0]) { dfs(i, j, 0, board, w, flag); }3. 没有处理重复使用格子题目要求同一个单元格不能重复使用。所以需要flag或visited来记录当前路径中已经访问过的格子。如果true表示已经访问那么递归到下一个格子前应该判断!flag[x][y]4. 检查错了访问位置准备从(i,j)走到(x,y)时要检查的是下一个格子(x,y)是否已经访问!flag[x][y]不是检查当前格子flag[i][j]因为真正决定下一步能不能走的是目标位置。5. 终止条件写成k word.length如果已经进入 DFS 后还要访问word[k]那么k word.length时就会越界。更自然的写法是当前字符匹配成功后判断它是不是最后一个字符if (k word.length - 1) { ans true; return; }复杂度分析设网格大小为m x n单词长度为L。时间复杂度O(m * n * 4 * 3^(L - 1))。每个格子都可能作为起点第一步最多有 4 个方向之后因为不能走回已访问格子每一步最多大约有 3 个方向。空间复杂度O(m * n L)。flag数组需要O(m * n)递归栈深度最多为L。复盘这题的核心不是 DFS 框架本身而是把 DFS 的状态定义清楚。dfs(i, j, k)的含义是当前格子 board[i][j] 要匹配 word[k]有了这个定义代码顺序就比较清楚1. 判断当前字符是否匹配 2. 判断是否已经匹配到最后一个字符 3. 标记当前格子已访问 4. 枚举四个方向继续搜索 5. 恢复当前格子的访问状态本次主要问题有两个1. 一开始只从 (0,0) 搜索漏掉其他起点 2. 一开始没有正确维护 flag导致格子可能被重复使用后面修正时最关键的是统一flag的语义false 没访问过 true 当前路径已经访问过只要这个语义稳定递归前判断!flag[x][y]进入后标记退出前恢复回溯逻辑就不会乱。Tips矩阵回溯题可以先问自己三个问题1. 起点是不是固定的如果不是就要枚举所有起点。 2. 当前递归参数分别表示什么 3. 当前路径里哪些状态需要回溯恢复对于这题可以记住一句话每个格子负责匹配一个字符当前路径用过的格子不能再走退出当前路径时恢复现场。

相关新闻

用友(畅捷通)软件多少钱?四川企业选购用友软件指南

用友(畅捷通)软件多少钱?四川企业选购用友软件指南

用友软件报价与产品选型指南——四川本地企业采购实战手册 | 六大产品线全解析不少四川企业经营者、财务负责人做数字化转型调研时,最先关注的核心问题就是"用友软件多少钱"。用友旗下拥有完整产品矩阵,不存在统一固定售价,价格主要…

2026/8/3 5:04:54 阅读更多 →
ROS2数据记录丢帧问题深度解析与优化实战

ROS2数据记录丢帧问题深度解析与优化实战

1. 项目概述:ROS2数据记录中的“记忆”丢失 在机器人开发与调试的日常工作中,ROS2的 rosbag2 工具是我们不可或缺的“黑匣子”。它忠实地记录着话题(Topic)上的所有消息,让我们能在实验室里复现实车测试的场景&#…

2026/8/2 2:50:33 阅读更多 →
从零搭建Azkaban任务调度平台:Solo与集群模式部署实践

从零搭建Azkaban任务调度平台:Solo与集群模式部署实践

1. 项目概述与核心价值最近在梳理团队的数据处理流程,发现很多脚本和任务散落在各个服务器上,靠 crontab 硬撑着。时间依赖复杂一点的任务,比如B任务必须在A任务成功完成后才能启动,或者每天凌晨需要按顺序跑几十个ETL脚本&#x…

2026/8/3 5:04:54 阅读更多 →

最新新闻

APK Installer:在Windows上无缝安装安卓应用的智能解决方案

APK Installer:在Windows上无缝安装安卓应用的智能解决方案

APK Installer:在Windows上无缝安装安卓应用的智能解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经希望在Windows电脑上直接安装安卓应用…

2026/8/3 5:06:28 阅读更多 →
深度学习损失函数全解析:从MSE到Focal Loss的原理与应用实战

深度学习损失函数全解析:从MSE到Focal Loss的原理与应用实战

1. 损失函数:深度学习的“导航仪”与“裁判”在深度学习的项目实战里,无论是训练一个识别猫狗的模型,还是让机器狗学会协调步伐,我们总会遇到一个核心问题:怎么告诉模型它做得好不好?模型在训练时&#xff…

2026/8/3 5:06:28 阅读更多 →
Steam游戏自动破解工具:3步完成DRM移除的终极指南

Steam游戏自动破解工具:3步完成DRM移除的终极指南

Steam游戏自动破解工具:3步完成DRM移除的终极指南 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam游戏自动破解工具是一款专业的开源解决方案,专门为合法购…

2026/8/3 5:06:28 阅读更多 →
Python接单实战指南:从数据分析到Web开发的技术变现路径

Python接单实战指南:从数据分析到Web开发的技术变现路径

这次我们来看一个关于“在家用Python接单”的话题。标题里提到的“昨天488,一台电脑,方法简单”非常吸引人,它指向了一个很多技术爱好者关心的问题:如何利用自己的编程技能,在业余时间创造收入。这篇文章不会给你画饼&…

2026/8/3 5:06:28 阅读更多 →
如何快速解决电脑自动锁屏问题:Mouse Jiggler 完整使用指南

如何快速解决电脑自动锁屏问题:Mouse Jiggler 完整使用指南

如何快速解决电脑自动锁屏问题:Mouse Jiggler 完整使用指南 【免费下载链接】mousejiggler Mouse Jiggler is a very simple piece of software whose sole function is to "fake" mouse input to Windows, and jiggle the mouse pointer back and forth.…

2026/8/3 5:06:28 阅读更多 →
离线环境PyTorch CPU到GPU迁移:版本匹配、依赖下载与安装验证全指南

离线环境PyTorch CPU到GPU迁移:版本匹配、依赖下载与安装验证全指南

1. 从CPU到GPU:一次彻底的PyTorch环境迁移最近在帮一个朋友处理他的深度学习项目,他之前一直用CPU版本的PyTorch跑模型,训练一个简单的图像分类任务都要等上大半天。项目临近交付,时间紧迫,他终于下定决心要把环境切换…

2026/8/3 5:05:28 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →