题目描述

给定一个仅包含数字 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;
};