003.leetcode17.电话号码的字母组合-Javascript

188 阅读1分钟

17. 电话号码的字母组合

难度中等792

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

img

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

方法1:

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    //arr = ["abc", "def"]
    let arr_multi = arr => {
        temp = []
        for(let i = 0; i < arr[0].length; i++){
            for(let j = 0; j < arr[1].length; j++){
                //temp = ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
                temp.push(`${arr[0][i]}${arr[1][j]}`)
            }
        }
        //arr => [["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]],注意arr[0]才是答案
        arr.splice(0,2,temp)
        if(arr.length > 1){
            arr_multi(arr)
        }
    }

    if(digits.length){
        let map = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
        //"23" => ['2', '3'] => ["abc", "def"]
        let after_trans = digits.split('').map(item => map[item * 1])
        if(digits.length>1){
            arr_multi(after_trans)
        }else{//["abc"]
            //["abc"] => "abc" => ['a', 'b', 'c']
            return after_trans.join('').split('')
        }
        return after_trans[0]
    }else{
        return []
    }
};

思路:由于不知道具体会输入多少个数字,所以使用递归,每次都是两两组合,组合后替换第一个元素,然后再两两组合,直到数组中只有一个元素,此时返回。