电话号码的字母组合-LeetCode
17. 电话号码的字母组合 - Letter Combinations of a Phone Number
🎯 问题描述(来源于LeetCode)
描述:
给定一个仅包含数字 2-9 的字符串 digits,返回所有它能表示的字母组合。答案可以按任意顺序返回。
数字到字母的映射如下(与电话按键相同):
- 2: “abc”
- 3: “def”
- 4: “ghi”
- 5: “jkl”
- 6: “mno”
- 7: “pqrs”
- 8: “tuv”
- 9: “wxyz”
注意:1 不对应任何字母,0 也不对应。
说明:
- 输入字符串可能为空,此时返回空列表。
示例:
- 示例 1:
1 | 输入: digits = "23" |
- 示例 2:
1 | 输入: digits = "" |
- 示例 3:
1 | 输入: digits = "2" |
💻 解题思路
思路:回溯法(DFS)
算法步骤
- 定义全局映射字典或列表
MAPPING,将数字映射到对应的字母串(索引 0 和 1 为空字符串,方便直接通过int(digit)获取)。 - 如果
digits为空,直接返回空列表。 - 初始化结果列表
ans和路径列表path(长度为n,存储每个位置选择的字母)。 - 定义递归函数
dfs(i):- 如果
i == n,说明已处理完所有数字,将path拼接成字符串加入ans,并返回。 - 否则,获取当前数字对应的所有可能字母:
letters = MAPPING[int(digits[i])]。 - 遍历每个字母
c,将path[i]设为c,然后递归调用dfs(i+1)。
- 如果
- 从
dfs(0)开始搜索。 - 返回
ans。
代码实现
1 | from typing import List |
📊 性能分析
- 时间复杂度:,其中 是
digits的长度。每个数字最多对应 4 个字母(如 7、9),因此组合数为 ,每个组合需要 时间拼接。 - 空间复杂度:,递归栈深度为 ,加上路径数组
path和结果存储(结果不计入空间复杂度)。
思考
- 回溯法是解决排列组合问题的经典算法,核心是“选与不选”的递归分支。
- 本题也可以使用队列(BFS)迭代构建,但 DFS 更简洁。
- 注意
path的用法:预先分配固定长度列表,通过索引赋值,避免频繁创建字符串,提高效率。 MAPPING可以定义为字典,但使用列表索引更直接。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






