力扣一日一练(21)——电话号码字母的组合

132 阅读1分钟

题目:电话号码字母的组合

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

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

 

示例:

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


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

 

使用JavaScript语言:

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    var arr = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
    if(digits == ''){
        return [];
    }else{
        var newarr = [];
        digits.split('').forEach(function(item){
            var arr2 = arr[item].split('');
            newarr.push(arr2)
        })
        // console.log(newarr)
        var all = [];
        all = newarr.reduce(function(a,b){
            var temp = []
            a.forEach(function(a){
                b.forEach(function(b){
                    temp.push(a + b)
                })
            })
            // console.log(temp)
            return temp
        })
        return all
    }
    
};

 

分析

首先先根据digits是否有数字进行判断分析,如果是空字符串,则返回空数组。然后建立一个数组arr去对应键盘上0-9的英文字母数组。将digits字符串中的字符使用split切割,然后使用forEach去对数字循环遍历,产生一个二维的字母数组。

以‘234’为例子,产生的newarr数组如下:

然后使用reduce去进行相加,reduce这个过程分为两步:

先是['a','b','c']和["d", "e", "f"]相加得出ad,ae,af,bd,be,bf,cd,ce,cf数组,然后是ad,ae,af,bd,be,bf,cd,ce,cf数组和["g", "h", "i"]相加,得到最后的数组:["adg", "adh", "adi", "aeg", "aeh", "aei", "afg", "afh", "afi", "bdg", "bdh", "bdi", "beg", "beh", "bei", "bfg", "bfh", "bfi", "cdg", "cdh", "cdi", "ceg", "ceh", "cei", "cfg", "cfh", "cfi"]