给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
JavaScript 的函数执行机制
-
函数会一直执行到遇见
return
或执行完所有语句 -
没有
return
的函数默认返回undefined
-
在递归中,不恰当的继续执行会导致调用栈堆积
参数详解:
1.index
参数
作用:表示当前正在处理输入数字字符串中的第几个数字,从0开始计数
2.current
参数
作用:累积当前已生成的字母组合字符串
思考:
Q:为什么不用 for...in
?
A:for...in
用于遍历对象属性,字符串遍历应用 for...of
代码实现:
javascript
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function (digits) {
// 处理空输入情况
if (digits.length === 0) {
return [];
}
// 数字字母映射表
const digitToLetters = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
};
const result = [];
// 定义回溯函数,递归生成所有组合
function backtrack(index, current) {
// 当处理完所有数字时终止
if (index === digits.length) {
result.push(current);
return; // 结束当前递归分支
}
// 获取的数字对应的字母字符串
const letters = digitToLetters[digits[index]];
// 遍历当前数字对应的每个字母
for (const letter of letters) {
// 递归调用,处理下一个数字,并将当前字母添加到组合中
backtrack(index + 1, current + letter);
}
}
// 调用回溯函数:从第0个数字和空字符串开始
backtrack(0, '');
return result;
};