登录/注册

lc79

更多

好的!LeetCode 79题 “单词搜索” 是一个经典的回溯算法(DFS)问题。以下是中文详解及代码实现:


问题描述

给定一个 m x n 的二维字符网格 board 和一个字符串 word,判断 word 是否存在于网格中。

规则

  1. 单词必须按照字母顺序,通过相邻的单元格(上下左右)内的字母构成。
  2. 同一个单元格内的字母不允许重复使用

解题思路:回溯(DFS)

  1. 遍历起点:遍历网格的每个单元格,作为搜索的起点。
  2. DFS 递归搜索:从当前单元格出发,向四个方向递归搜索匹配下一个字符。
  3. 回溯关键
    • 标记已访问:避免重复使用同一单元格(临时修改为特殊字符如 \0)。
    • 恢复状态:递归返回后,将单元格恢复为原字符,允许其他路径使用。
  4. 终止条件
    • 越界或字符不匹配 → 失败。
    • 已匹配所有字符 → 成功。

复杂度分析


代码实现(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;
    }
}

关键点说明

  1. 方向处理:使用方向数组 dirs = [(1,0), (-1,0), (0,1), (0,-1)] 可简化代码(Python 示例中直接展开以提高可读性)。
  2. 剪枝优化:在递归前检查下一个字符是否匹配,减少无效递归。
  3. 避免重访问:通过修改原矩阵或使用额外 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

lc配线架都是双线吗

LC配线架并不一定都是双线。LC配线架是指使用LC类型的光纤连接器的配线架,LC

2024-06-11 09:54:28

中颖电子SH79F642B_SH79F6421规格书

中颖电子SH79F642B_SH79F6421_CV2.0规格书

资料下载 华秋商城 2022-10-19 17:36:22

1J79铁镍合金特性及作用综述

高饱和磁感应软磁1J79铁镍合金是含79-80%的镍合金具有高的初始磁导率以及最大磁导率及低的矫顽力,1J79饱和磁感应强度大于0.75T,初始

资料下载 上海乾福 2021-09-08 15:45:04

台信交流型接近开关产品HJG79-3PT-A

台信交流型接近开关产品HJG79-3PT-A

资料下载 台信电气 2021-08-19 11:28:39

简易LC滤波器设计方案

简易LC滤波器设计方案

资料下载 佚名 2021-06-22 10:01:49

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

2021-07-15 20:00:04

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

2019-07-04 12:53:01
7天热门专题 换一换
相关标签