650 字
3 分钟
电话号码的字母组合

题目描述#

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

解题思路#

  1. 回溯法框架
    • 建立数字-字母映射表
    • 递归处理每个数字,遍历其对应字母
    • 当前路径添加字母后进入下一层递归
    • 路径长度等于输入数字串时保存结果
  2. 队列迭代法
    • 初始化队列为空组合 [""]
    • 遍历每个数字,将队列中组合与当前数字字母组合
    • 生成新组合并入队
  3. DFS/BFS选择
    • 回溯法本质是DFS,空间效率高
    • 迭代法为BFS,无递归开销

关键洞察#

  1. 笛卡尔积本质
    • 每个数字对应一组字母
    • 最终结果 = 各数字对应字母集的笛卡尔积
  2. 递归深度控制
    • 递归深度 = 输入数字串长度
    • 每层对应一个数字的选择
  3. 无剪枝需求
    • 所有组合均有效,无需剪枝
  4. 映射表优化
    • 预处理映射表避免重复查询
    • 支持灵活扩展字母映射

复杂度分析#

指标说明
时间复杂度O(3ᴺ × 4ᴹ):N为3字母数字数,M为4字母数字数(7/9)
空间复杂度O(L):递归栈深度L(输入长度)+ 结果空间 O(3ᴺ × 4ᴹ)

代码实现#

回溯法

/**
* @link {https://leetcode.cn/problems/letter-combinations-of-a-phone-number/}
* @param {string} digits
* @return {string[]}
*/
const letterCombinations = (digits) => {
if (!digits) return [];
// 数字-字母映射
const map = {
'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl',
'6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'
};
const res = [];
const backtrack = (index, path) => {
// 完成组合:保存路径
if (index === digits.length) {
res.push(path);
return;
}
// 遍历当前数字对应字母
const letters = map[digits[index]];
for (const char of letters) {
backtrack(index + 1, path + char); // 递归下一层
}
};
backtrack(0, '');
return res;
};

队列迭代法

/**
* @link {https://leetcode.cn/problems/letter-combinations-of-a-phone-number/}
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function (digits) {
if (!digits.length) return [];
const map = {
'2': ['a', 'b', 'c'],
'3': ['d', 'e', 'f'],
'4': ['g', 'h', 'i'],
'5': ['j', 'k', 'l'],
'6': ['m', 'n', 'o'],
'7': ['p', 'q', 'r', 's'],
'8': ['t', 'u', 'v'],
'9': ['w', 'x', 'y', 'z']
};
let queue = [''];
for (const digit of digits) {
const nextQueue = [];
const letters = map[digit];
for (const str of queue) {
for (const char of letters) {
nextQueue.push(str + char);
}
}
queue = nextQueue;
}
return queue;
};

相似题目#

电话号码的字母组合
https://website-truelovings-projects.vercel.app/posts/algorithms/电话号码的字母组合/
作者
欢迎来到StarSky的网站!
发布于
2025-08-13
许可协议
CC BY-NC-SA 4.0