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

输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
思路&js代码
1、归并
var letterCombinations = function (digits) {
const map = [, , "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
let result = []
for (let i = 0; i < digits.length; i++) {
result = _compose(result, [...map[digits[i]]])
}
return result
function _compose(arr1, arr2) {
if (arr1.length === 0) return arr2
if (arr2.length === 0) return arr1
const r = []
for (let i = 0; i < arr1.length; i++) {
for (let j = 0; j < arr2.length; j++) {
r.push(arr1[i] + arr2[j])
}
}
return r
}
};2、回溯
const MAPPING = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
var letterCombinations = function(digits) {
const n = digits.length;
if (n === 0) {
return [];
}
const path = Array(n); // 注意 path 长度一开始就是 n,不是空数组
const ans = [];
function dfs(i) {
if (i === n) {
ans.push(path.join(""));
return;
}
const letters = MAPPING[Number(digits[i])];
for (const c of letters) {
path[i] = c; // 直接覆盖
dfs(i + 1);
}
}
dfs(0);
return ans;
};