/** * @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; }