【回溯-6】79.单词搜索
题目描述给定一个m x n二维字符网格board和一个字符串单词word。如果word存在于网格中返回true否则返回false。单词必须按照字母顺序通过相邻的单元格内的字母构成其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例 1输入board [[A,B,C,E],[S,F,C,S],[A,D,E,E]], word ABCCED输出true示例 2输入board [[A,B,C,E],[S,F,C,S],[A,D,E,E]], word SEE输出true示例 3输入board [[A,B,C,E],[S,F,C,S],[A,D,E,E]], word ABCB输出false解题思路方法一回溯 DFS核心思路从每个格子出发尝试匹配word的第一个字符然后向四个方向扩展。匹配成功继续匹配下一个字符匹配失败回溯换方向越界或已访问跳过关键操作标记已访问把当前格子改成特殊字符如#避免重复使用四个方向上、下、左、右回溯恢复格子的原字符具体过程示例board [[A,B,C,E],[S,F,C,S],[A,D,E,E]],word ABCCED路径: A → B → C → C → E → D (0,0) → (0,1) → (0,2) → (1,2) → (2,2) → (2,1) A B C E S F C S A D E E代码实现class Solution { public: bool exist(vectorvectorchar board, string word) { int m board.size(), n board[0].size(); for (int i 0; i m; i) { for (int j 0; j n; j) { if (dfs(board, word, i, j, 0)) { return true; } } } return false; } private: bool dfs(vectorvectorchar board, string word, int i, int j, int index) { // 匹配完成 if (index word.size()) return true; // 越界或不匹配 if (i 0 || i board.size() || j 0 || j board[0].size() || board[i][j] ! word[index]) { return false; } // 标记已访问 char temp board[i][j]; board[i][j] #; // 四个方向搜索 bool found dfs(board, word, i 1, j, index 1) || dfs(board, word, i - 1, j, index 1) || dfs(board, word, i, j 1, index 1) || dfs(board, word, i, j - 1, index 1); // 恢复 board[i][j] temp; return found; } };复杂度分析设m × n是网格大小L是单词长度。维度复杂度说明时间复杂度O(m × n × 3^L)每个格子出发每步最多3个方向不回头空间复杂度O(L)递归栈深度为什么是 3^L 而不是 4^L因为每次不能走回头路已访问的格子被标记所以每步最多3个方向。关键细节1. 为什么用#标记已访问避免重复使用同一个格子比额外维护visited数组更省空间回溯时恢复原字符2. 为什么四个方向用||连接只要有一个方向能找到就返回true。||有短路特性找到后不再继续搜索。3. 为什么先判断index word.size()当index等于单词长度时说明所有字符都匹配完了返回true。4. 为什么越界判断放在前面避免访问越界的内存同时判断字符是否匹配。方法二用visited数组代码实现class Solution { public: bool exist(vectorvectorchar board, string word) { int m board.size(), n board[0].size(); vectorvectorbool visited(m, vectorbool(n, false)); for (int i 0; i m; i) { for (int j 0; j n; j) { if (dfs(board, word, visited, i, j, 0)) { return true; } } } return false; } private: bool dfs(vectorvectorchar board, string word, vectorvectorbool visited, int i, int j, int index) { if (index word.size()) return true; if (i 0 || i board.size() || j 0 || j board[0].size() || visited[i][j] || board[i][j] ! word[index]) { return false; } visited[i][j] true; bool found dfs(board, word, visited, i 1, j, index 1) || dfs(board, word, visited, i - 1, j, index 1) || dfs(board, word, visited, i, j 1, index 1) || dfs(board, word, visited, i, j - 1, index 1); visited[i][j] false; return found; } };缺点需要额外 O(m × n) 空间。两种方法对比方法时间复杂度空间复杂度推荐度原地标记O(m × n × 3^L)O(L)⭐⭐⭐⭐⭐visited 数组O(m × n × 3^L)O(m × n L)⭐⭐⭐⭐总结要点说明核心思想从每个格子出发DFS 匹配单词关键操作标记已访问 → 四方向搜索 → 恢复终止条件index word.size()返回 true时间复杂度O(m × n × 3^L)空间复杂度O(L)

相关新闻

【回溯-7】494.目标和

【回溯-7】494.目标和

题目描述:给你一个非负整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 :例如,nums [2, 1] ,可以在 2 之前添加 ,在 1 之前添加…

2026/10/5 6:55:27 阅读更多 →
A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?

A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?

一句话结论:尾盘筛选“变慢”时,先判断数据是“旧了”还是“到得慢”,再按“请求次数 → 限流与重试 → 网络 → 本地计算 → 调度”的顺序逐段计时。多数情况下,瓶颈出在逐只请求、重试放大和本地处理上,而不在行情源…

2026/10/5 6:54:27 阅读更多 →
第039篇 synchronized 原理:对象头、锁升级与重量级锁

第039篇 synchronized 原理:对象头、锁升级与重量级锁

synchronized 这题的分水岭特别清楚:能答出"对象头 Mark Word + monitorenter"的人不少,能讲清"锁升级的四个阶段、偏向锁在 JDK 15 被废弃、以及为什么 wait 必须在锁内调用"的人很少。面试官问的就是后面这层。理解了升级路径与锁竞争的真实代价,这道…

2026/10/5 6:54:27 阅读更多 →

最新新闻

插件机制详解:IAR插件、加载失败排查与MusicFree配置

插件机制详解:IAR插件、加载失败排查与MusicFree配置

1. 插件机制到底在解决什么问题先说个真实体验。我这些年一直在折腾各类工具链,从嵌入式 IDE 到持续交付平台再到日常用的播放器,慢慢发现一个规律:凡是活得久、生态大的软件,几乎没有一个不是靠 plugins 撑起来的。编辑器要靠插件…

2026/10/5 8:04:58 阅读更多 →
FPGA高速接口调试必备:IBERT眼图测试原理与实战指南

FPGA高速接口调试必备:IBERT眼图测试原理与实战指南

1. IBERT眼图测试到底解决什么问题 先说结论:在FPGA高速串行接口调试里,IBERT(Integrated Bit Error Ratio Tester)眼图测试,是验证光纤接口信号质量最快、最省事的办法,没有之一。 很多工程师拿到一块带有…

2026/10/5 8:04:58 阅读更多 →
Xilinx IBERT光纤接口眼图测试实战:从搭建到链路排查

Xilinx IBERT光纤接口眼图测试实战:从搭建到链路排查

上个月调试一块自研的FPGA板卡,光口上电后业务一直跑不通,链路对端报了一堆CRC错误。排查了半天,最后是靠在Vivado里拉了一个IBERT核,对着SFP光模块做了一圈眼图扫描才定位到问题——居然是GTX参考时钟的走线串扰,眼图…

2026/10/5 8:04:58 阅读更多 →
SpringBoot+Vue宠物商城项目全解析:从架构到部署

SpringBoot+Vue宠物商城项目全解析:从架构到部署

先说一句大实话:SpringBoot Vue 这类商城项目,放到 GitHub 上一抓一大把,但绝大多数都是“能跑就行”的半成品——代码乱、没注释、表结构随意、前端页面粗制滥造。真正适合拿去当毕设、课设,或者静下心来学一遍的,反…

2026/10/5 8:04:58 阅读更多 →
SPI模式读写SD卡稳定性的关键:时序细节与状态机设计

SPI模式读写SD卡稳定性的关键:时序细节与状态机设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 8:04:58 阅读更多 →
Tesseral地震正演建模实操:原理、案例与扩散模型应用

Tesseral地震正演建模实操:原理、案例与扩散模型应用

做地震勘探这行,手里总得有个趁手的正演工具。Tesseral是我接触过的多套正演软件里上手最快的一个,它最核心的价值就是解决一件很具体的事:把地下介质的速度、密度、构造形态做成一个可计算的地震模型,然后正演出一炮炮合成地震记…

2026/10/5 8:03:57 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →