/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function (digits) {
// 如果传入digits为空,则直接返回结果[]
if (!digits || !digits.length) {
return [];
}
// 使用Map存储按键对应的字母
const map = new Map([
['2', 'abc'],
['3', 'def'],
['4', 'ghi'],
['5', 'jkl'],
['6', 'mno'],
['7', 'pqrs'],
['8', 'tuv'],
['9', 'wxyz'],
]);
// 存储最终结果
let result = [];
// 回溯生成所有的字符串组合
function backtrack(str, current) {
// 递归终止条件
// 当生成的字符串长度等于输入长度时,表示生成完毕,储存结果并退出循环。
// 若不退出,由于current已经超出了digits长度,会因map.get获取值为空而报错。
if (str.length === digits.length) {
result.push(str);
return;
}
// 当前层递归逻辑
// 从Map中获取当前输入的数字映射的字母
const digit = map.get(digits[current]);
// 遍历当前映射的字符串,生成不同组合
for (let i = 0; i < digit.length; i++) {
// 下探到下层递归
// 在当前字符串中选取一个字母,进入下一层递归的选择
backtrack(str + digit[i], current + 1);
}
}
// 回溯生成组合,初始状态str为空,current为0
backtrack('', 0);
return result;
};
评论