[路飞]_程序员必刷力扣题: 17. 电话号码的字母组合

「这是我参与2022首次更文挑战的第37天,活动详情查看:2022首次更文挑战

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

image.png

示例 1:

输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
复制代码

示例 2:

输入: digits = ""
输出: []
复制代码

示例 3:

输入: digits = "2"
输出: ["a","b","c"]
复制代码

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

reduce循环

思路 有题目可知,我们需要通过手机上的数字按键拼出所有的字母子组合

很明显我们都知道需要通过循环去遍历出所有的结果

但是问题是按键的数量是不确定的,不知道会有几个数字

所以这里我们通过reduce的双循环每次拿出两个数组对应的英文字母进行组合,然后再用组合的结果和下一个数字对应的字母去循环,这样把多层循环简化成2层循环了

具体实现:

  • 处理边界条件,如果digits为空的时候,直接返回空数组
  • 声明map对象,将每一个数字对应的字母列出来
  • 将digits用split打断成数组然后用reduce循环
  • 将total和item的所有可能双循环遍历出来保存在res中返回,最后会处理处所有的可能

最后直接返回循环结果即可

var letterCombinations = function (digits) {
    if (!digits) return []
    var map = {
        2: ['a', 'b', 'c'],
        3: ['d', 'e', 'f'],
        4: ['g', 'h', 'i'],
        5: ['j', 'k', 'l'],
        6: ['m', 'n', 'o'],
        7: ['p', 'q', 'r', 's'],
        8: ['t', 'u', 'v'],
        9: ['w', 'x', 'y', 'z']
    }
    var arr = digits.split('').map(item => map[item])
    return arr.reduce((total, item) => {
        var res = []
        for (var i = 0; i < total.length; i++) {
            for (var j = 0; j < item.length; j++) {
                res.push(total[i] + item[j])
            }
        }
        return res
    })
};
复制代码

谢谢大家,一起加油

猜你喜欢

转载自juejin.im/post/7068676944430104584