algorighm/backtrack/combinations/17电话号码.js

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;
}