55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
/**
|
|
* @param {string} digits
|
|
* @return {string[]}
|
|
* https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
|
|
*/
|
|
const letterCombinations = function (digits) {
|
|
|
|
};
|
|
|
|
function f1(digits) {
|
|
// 特殊情况处理:如果输入是空字符串,直接返回空数组
|
|
if (!digits) return [];
|
|
|
|
// 数字到字母的映射表(与手机九宫格一致),下标 0 和 1 没有对应字母
|
|
const map = [
|
|
[], // 0
|
|
[], // 1
|
|
['a', 'b', 'c'], // 2
|
|
['d', 'e', 'f'], // 3
|
|
['g', 'h', 'i'], // 4
|
|
['j', 'k', 'l'], // 5
|
|
['m', 'n', 'o'], // 6
|
|
['p', 'q', 'r', 's'], // 7
|
|
['t', 'u', 'v'], // 8
|
|
['w', 'x', 'y', 'z'], // 9
|
|
];
|
|
|
|
const result = []; // 存放所有可能的组合结果
|
|
|
|
/**
|
|
* 回溯函数
|
|
* @param {string[]} path 当前递归路径(字符数组)
|
|
* @param {number} start 当前处理的是 digits 的第几个字符
|
|
*/
|
|
const backtrack = (path, start) => {
|
|
// 递归终止条件:如果 path 长度等于输入数字的长度,说明已经生成一个完整组合
|
|
if (start === digits.length) {
|
|
result.push(path.join('')); // 把字符数组转成字符串加入结果中
|
|
return;
|
|
}
|
|
|
|
// 获取当前数字对应的所有字母(注意把字符转成数字作为索引)
|
|
for (const letter of map[+digits[start]]) {
|
|
path.push(letter); // 做选择:添加一个字母
|
|
backtrack(path, start + 1); // 递归处理下一个数字
|
|
path.pop(); // 回溯:撤销上一步选择,尝试其他字母
|
|
}
|
|
};
|
|
|
|
// 从空路径、起始位置 0 开始回溯搜索
|
|
backtrack([], 0);
|
|
|
|
return result;
|
|
}
|