Algorithms first

电话号码的字母组合 · 交互式算法学习

返回电话按键数字可表示的所有字母组合。

#17 · 回溯

电话号码的字母组合

Letter Combinations of a Phone Number

测试用例digits = "23"
递归树3 个关键状态
步骤 1选择 2 的字母 a。path=a
23
推荐

回溯生成当前路径

时间 O(4^n)空间 O(n)

路径长度等于数字数时输出,否则枚举当前按键字母。

1function letterCombinations(d) {2  if (!d) return [];3  const map = ['', '', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'],4    out = [];5 6  function dfs(i, path) {7    if (i === d.length) {8      out.push(path);9      return10    }11    for (const c of map[d[i]]) dfs(i + 1, path + c)12  }13  dfs(0, '');14  return out;15}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public List<String> letterCombinations(String digits) {3        List<String> ans = new ArrayList<>();4        if (digits.length() == 0) {5            return ans;6        }7        ans.add("");8        String[] d = new String[] {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};9        for (char i : digits.toCharArray()) {10            String s = d[i - '2'];11            List<String> t = new ArrayList<>();12            for (String a : ans) {13                for (String b : s.split("")) {14                    t.add(a + b);15                }16            }17            ans = t;18        }19        return ans;20    }21}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

电话号码的字母组合 · 解法对比

返回电话按键数字可表示的所有字母组合。

测试用例
digits = "23"
题目分类
回溯
解法对比
2
方案 1

笛卡尔积逐层扩展

从空串开始,每个数字把已有前缀扩展成多份。

时间
O(4^n)
空间
O(4^n)
方案 2

回溯生成当前路径

路径长度等于数字数时输出,否则枚举当前按键字母。

时间
O(4^n)
空间
O(n)