题目描述
word 能否在网格里相邻连续拼出:每一步只能走上下左右,且同一格不能重复用。思路解析动画文字版
最直接的想法:拿每个格子当起点暴力试。但只要不把「正在走的路径」标记成用过,就会从 A 走到 B、又从 B 退回 A,原地来回、甚至无限绕——根本停不下来。
关键招是回溯:进入 (i,j) 先把它改成占位符 #(占住,四向递归就不会再踩它),等这一格的所有方向都探完,再把它改回原字母。这样别的起点、别的方向还能复用这格。匹配当前字符 → 占住 → 四向找下一个字符 → 撤销,是这题的主循环。
起点 (0,0) = A:扫格子找单词首字母:(0,0)=A 和 word[0]='A' 对上,从这里开始 DFS,目标是接着找 word[1]='B'。
占住 A · 四向找 B:把 (0,0) 临时改成 # 占住(灰)。看它四周找 'B':上、左越界,下方 (1,0)=S 不是 B,右边 (0,1)=B 对上了,走过去。
占住 B · 准备找 F:把 (0,1)=B 也占住(灰)。前两个字符 'AB' 已经拼上,现在要在 B 的四个邻居里找 word[2]='F',按「上右下左」顺序逐个试。
先试右邻 (0,2)=E:B 上方越界,先看右邻 (0,2)=E,递归进去比一比:它等于要找的 'F' 吗?
负例:E ≠ F → 这个方向不通:负例:(0,2)=E,不等于要找的 'F',这一格直接失败返回,不会占住它、也不会往下递归。回到 B,继续试 B 的下一个方向。
换方向:B 的下方 (1,1)=F:E 不通,换试 B 下方 (1,1)=F——正好是要找的 'F'!走过去。这一步就是「走不通就回退、换下一个方向」。
匹配完成 → true:(1,1)=F 是 word 的最后一个字符,k 已经到末尾,整条路径 A→B→F 拼全 → 返回 true。(若这格也没拼下去,就会一路回退、把沿途 # 改回原字母,换起点重来。)
回溯:撤销标记还原网格:收尾看清「撤销」这步:递归往回退时,沿途的 (1,1)、(0,1)、(0,0) 依次把 # 改回 F、B、A,网格恢复原样。这样换别的起点搜索时,这些格子还是干净可用的。
凡是「在网格里搜一条满足条件的路径」都是网格回溯:进格子先占住防重复,走不通就撤销标记、退回换方向。迷宫、最长递增路径、岛屿连通都是它的变体。
迁移阶梯:把这题练到能复述后,再去同类题里迁移:先复用状态定义,再调整边界条件。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
参考代码
class Solution: def exist(self, board, word): m, n = len(board), len(board[0]) def dfs(r, c, i): if i == len(word): return True if r < 0 or r >= m or c < 0 or c >= n or board[r][c] != word[i]: return False ch = board[r][c] board[r][c] = '#' found = dfs(r + 1, c, i + 1) or dfs(r - 1, c, i + 1) or dfs(r, c + 1, i + 1) or dfs(r, c - 1, i + 1) board[r][c] = ch return found for r in range(m): for c in range(n): if dfs(r, c, 0): return True return False复杂度
- 时间复杂度:O(m·n·4^L),m·n 个起点,每步最多 4 个方向,深度 L
- 空间复杂度:O(L),递归栈深度 = 单词长度 L
可套用的代码模板
骨架:失败/成功先判、占住、四向递归、撤销标记。「占住」和「撤销」必须成对出现——这是网格回溯不出错的关键。
def dfs(i, j, 状态): if 当前格失败: return False # 剪枝 if 到达成功条件: return True 标记(i, j) = 占位符 # 占住 for ni, nj in 四个相邻方向: if 不越界 and 未被占住: if dfs(ni, nj, 新状态): return True 还原(i, j) = 原值 # 撤销标记(回溯) return False易错点
面试追问把动画讲成自己的话
追问为什么回溯时要恢复格子标记?
追问怎么剪枝?
追问复杂度?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
分割回文串
LeetCode 131 · 中等 · 沿着 回溯 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题