题目描述
思路解析动画文字版
两位写两层 for、五位写五层……可 digits 的长度是变量,层数不固定,嵌套循环根本写不出来,这是暴力解卡死的地方。
转折:用递归替掉「不定层循环」。先建好键盘映射 {2:abc, 3:def, ...};递归到第 i 位时,枚举 digits[i] 对应的几个字母,每选一个就 i+1 去定下一位;i 走到末尾说明每位都定好了,把 path 拼成串收进结果,然后撤销刚才那个字母,回上层换下一个。选→递归→撤销,三步循环。
第 1 位 "2" · 选 a:从第 1 位开始,digits[0]="2" 的候选是 a/b/c。先选 a,path=["a"],还没到末尾,i+1 进入第 2 位。
第 2 位 "3" · 选 d → 收 "ad":切到第 2 位:候选换成 digits[1]="3" 的 d/e/f(格子里的字母随之换成 d/e/f)。选 d,path=["a","d"],i 已到末尾——两位都定完,拼成 "ad" 收进结果。
撤销 d(回溯)· 换 e → 收 "ae":负例/回溯动作:把刚选的 d 弹出,path 退回 ["a"],d 重新变回「可选」。不撤销的话第 2 位会越积越长、串到下一个字母里。撤销后在第 2 位改选 e,收下 "ae"。
第 2 位 · 再换 f → 收 "af":同样撤销 e、改选 f,收下 "af"。第 2 位的 d/e/f 都和 a 配过了,a 打头的三种全齐。接着把第 2 位整个撤销、退回第 1 位换头。
换第 1 位 · 选 b:回到第 1 位,候选又变回 a/b/c。a 撤销后改选 b,path=["b"],再 i+1 去定第 2 位。流程和 a 打头时一模一样。
第 2 位 "3" · 选 d → 收 "bd":第 2 位又切到 d/e/f。选 d,path=["b","d"],到末尾,收下 "bd"。接着同样撤销换 e、换 f,能收 "be"、"bf"。
b 打头收齐 · 准备换 c:b 配完 d/e/f,收下 "be"、"bf"。b 打头的三种也全了。再撤销退回第 1 位,最后把头换成 c。
换头 c · 收齐全部 9 个:c 打头同样配 d/e/f,收下 "cd"、"ce"、"cf"。最终 9 种组合不重不漏全部收齐,正好是 3×3。
「多个位置、每个位置有几种选法、求全部搭配(笛卡尔积)」的通用解法:一层递归管一位,到底就收。位数不定时,它替你写出「层数随输入变化」的循环。
迁移阶梯:把这题练到能复述后,再去同类题里迁移:先复用状态定义,再调整边界条件。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
参考代码
class Solution: def letterCombinations(self, digits): if not digits: return [] mp = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'} ans = [] def backtrack(i, path): if i == len(digits): ans.append(''.join(path)) return for ch in mp[digits[i]]: path.append(ch) backtrack(i + 1, path) path.pop() backtrack(0, []) return ans复杂度
- 时间复杂度:O(4^n · n),n 位、每位最多 4 字母,拼每个串再花 O(n)
- 空间复杂度:O(n),递归深度 = 位数 n,path 也最多 n 长
可套用的代码模板
骨架:用 i 标记当前是第几位,i 到底就收快照,否则枚举本位候选、append 选、递归 i+1、pop 撤销。位数不定的「笛卡尔积」全套它。
def bt(i, path): if i == 总位数: res.append(path 的快照); return for 选项 in 第 i 位的候选: path.append(选项) bt(i + 1, path) # 关键:i+1 下探 path.pop() # 撤销易错点
面试追问把动画讲成自己的话
追问这题本质是什么?
追问一共多少种?
追问能用迭代(BFS)吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
N 皇后
LeetCode 51 · 困难 · 沿着 回溯 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题