LC 79回溯中等第 63 / 95 题

单词搜索

Word Search

回溯网格 DFS原地标记
本机进度仅保存在当前浏览器

题目描述

给定一个 m x n 二维字符网格 board 和一个字符串单词 word,如果 word 存在于网格中,返回 true;否则返回 false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,同一个单元格内的字母不允许被重复使用。

示例:board 含路径 ["A","B","C","E"], ["S","F","C","S"], ["A","D","E","E"],word = "ABCCED" 返回 true。

解题思路

  1. 从每个格子尝试作为起点做 DFS:当前字符匹配则向四个方向扩展匹配下一个字符。
  2. 访问标记用原地修改(把当前格临时改成特殊字符)实现,回溯时恢复,省去 visited 数组。
  3. 任一起点成功即返回 true;配合"字符不匹配立即回退"的剪枝即可通过数据规模。

参考实现

查看参考实现Python · 建议先自行作答
def exist(board, word):
    m, n = len(board), len(board[0])

    def dfs(i, j, k):
        # k 为待匹配的 word 下标
        if board[i][j] != word[k]:
            return False
        if k == len(word) - 1:
            return True
        board[i][j] = '#'  # 原地标记防重复访问
        found = False
        for x, y in ((i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)):
            if 0 <= x < m and 0 <= y < n and dfs(x, y, k + 1):
                found = True
                break
        board[i][j] = word[k]  # 回溯恢复
        return found

    return any(dfs(i, j, 0) for i in range(m) for j in range(n))

复杂度与归属

时间复杂度O(m · n · 3^L)
空间复杂度O(L)
所属分类回溯
题源LeetCode 79

关联教程

返回题图鉴