每天学习一点算法 2026/03/16
题目:电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

我们可以把每个数字对应的字母情况当做树的节点,然后统计路径结构即可。
比如,'26',对应 a b c 和 m n o,对应树结构如下:
' '
/ | \
a b c
/ | \ / | \ / | \
m n o m n o m n o
这种结构就好处理多了,我们遍历所有路径统计结果就行了。
typescript
function letterCombinations(digits: string): string[] {
// 数字字母映射表
const dist = {
'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'],
}
const resArr = [] // 结果数组
// 递归辅助函数
function helper (digits: string, index: number, str: string) {
if (index === digits.length) {
// 当前路径走到末尾 记录结果并回归
resArr.push(str)
return
}
const letters = dist[digits[index]] // 获取当前数字对应的字母
for (let i of letters) {
// 记录当前digits索引和结果字符串
let currentIndex = index
let currentStr = str
// 更新digits索引和结果字符串传入下一层递归
currentStr += i
currentIndex++
helper(digits, currentIndex, currentStr)
}
}
// 初始传入指针和空字符串
helper(digits, 0, '')
return resArr
};
题目来源:力扣(LeetCode)