lc79
好的!LeetCode 79题 “单词搜索” 是一个经典的回溯算法(DFS)问题。以下是中文详解及代码实现:
问题描述
给定一个 m x n 的二维字符网格 board 和一个字符串 word,判断 word 是否存在于网格中。
规则:
- 单词必须按照字母顺序,通过相邻的单元格(上下左右)内的字母构成。
- 同一个单元格内的字母不允许重复使用。
解题思路:回溯(DFS)
- 遍历起点:遍历网格的每个单元格,作为搜索的起点。
- DFS 递归搜索:从当前单元格出发,向四个方向递归搜索匹配下一个字符。
- 回溯关键:
- 标记已访问:避免重复使用同一单元格(临时修改为特殊字符如
\0)。 - 恢复状态:递归返回后,将单元格恢复为原字符,允许其他路径使用。
- 标记已访问:避免重复使用同一单元格(临时修改为特殊字符如
- 终止条件:
- 越界或字符不匹配 → 失败。
- 已匹配所有字符 → 成功。
复杂度分析
- 时间复杂度:
O(M × N × 3^L)
(M,N为网格尺寸,L为单词长度。每次递归有 3 个方向可选,起点有M×N个) - 空间复杂度:
O(L)(递归栈深度)
代码实现(Python)
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def dfs(i, j, k):
# 终止条件:越界或不匹配
if not (0 <= i < len(board) and 0 <= j < len(board[0])) or board[i][j] != word[k]:
return False
# 全部字符匹配成功
if k == len(word) - 1:
return True
# 标记已访问(临时修改为空字符)
tmp, board[i][j] = board[i][j], ''
# 向四个方向DFS搜索
res = dfs(i+1, j, k+1) or dfs(i-1, j, k+1) or dfs(i, j+1, k+1) or dfs(i, j-1, k+1)
# 回溯:恢复单元格状态
board[i][j] = tmp
return res
# 遍历所有起点
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i, j, 0):
return True
return False
代码实现(Java)
class Solution {
public boolean exist(char[][] board, String word) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (dfs(board, word, i, j, 0)) return true;
}
}
return false;
}
private boolean dfs(char[][] board, String word, int i, int j, int k) {
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != word.charAt(k)) {
return false;
}
if (k == word.length() - 1) return true;
char tmp = board[i][j];
board[i][j] = '\0'; // 标记已访问
boolean res = dfs(board, word, i+1, j, k+1) ||
dfs(board, word, i-1, j, k+1) ||
dfs(board, word, i, j+1, k+1) ||
dfs(board, word, i, j-1, k+1);
board[i][j] = tmp; // 回溯恢复
return res;
}
}
关键点说明
- 方向处理:使用方向数组
dirs = [(1,0), (-1,0), (0,1), (0,-1)]可简化代码(Python 示例中直接展开以提高可读性)。 - 剪枝优化:在递归前检查下一个字符是否匹配,减少无效递归。
- 避免重访问:通过修改原矩阵或使用额外
visited数组实现(前者更节省空间)。
测试建议:尝试用例
board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]],word = "ABCCED",预期结果为True。
如有任何疑问,欢迎继续提问!
LC-LC光纤的核心特点
LC-LC光纤是一种两端均采用LC(Lucent Connector)连接器的光纤跳线或光纤线,具有小型化、高密度、高性能和便捷操作等特点,广泛应用于数据中心、企业网络、通信系统、智能家居等多个领域
2026-03-30 10:14:42
1J79铁镍合金特性及作用综述
高饱和磁感应软磁1J79铁镍合金是含79-80%的镍合金具有高的初始磁导率以及最大磁导率及低的矫顽力,1J79饱和磁感应强度大于0.75T,初始
资料下载
上海乾福
2021-09-08 15:45:04
HMC570LC571LC571LC572LC904LC904LC5制革
HMC570LC571LC571LC572LC904LC904LC5制革
资料下载
张龙祥
2021-05-28 17:38:38
M79HC (M79H) 连接器版本是双平衡混频器
1970-01-01 08:00:00 至 1970-01-01 08:00:00
CA79 (A79) 连接器版本射频放大器
1970-01-01 08:00:00 至 1970-01-01 08:00:00
CAT-C8114-EJ79 CAT-C8114-EJ79 多功能插口式滤波器
电子发烧友网为你提供TE(ti)CAT-C8114-EJ79相关产品参数、数据手册,更有CAT-C8114-EJ79的引脚图、接线图、封装手册、中文资料、英文资料,CAT-C8114-EJ
LC并联谐振电路和LC串联谐振电路
根据电路中电感器L和电容器C的连接方式不同,共有两种基本的LC谐振电路:LC并联谐振电路和LC串联谐振电路。 在放大器电路和其它形式的信号处理电
2020-10-20 10:54:10
Chrome 78数据无法迁移到Chrome79,Google停止推出Android Chrome 79
众所周知,Google Chrome 79 于上周正式启动,用于受支持的台式机和移动操作系统。然而适用于 Android 的 Chrome 79 发行后不久,一些用户就开始在官方的 Chrome 帮助论坛上发帖声称,
2019-12-17 15:03:45
移远通信宣布其LC79D定位模组已进入量产阶段
LC79D基于Broadcom BCM47755芯片研发设计,可同时接收GPS、Galileo和QZSS的L1和L5频段,GLONASS和北斗的L1频段以及IRNSS的L5频段信号。
2019-11-05 09:19:07
EVBD-ACPL-C79A ACPL-C79B,ACPL-C79A和ACPL-C790隔离放大器评估板
电子发烧友网为你提供Broadcom(ti)EVBD-ACPL-C79A相关产品参数、数据手册,更有EVBD-ACPL-C79A的引脚图、接线图、封装手册、中文资料、英文资料,EVBD-ACPL-C
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览