leetcode-17-电话号码的字母组合

1,821 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

题目地址

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

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

示例 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'] 的一个数字。

解题思路

本题主体的解题思路很简单,遍历输入字符串,获取所有的字母,返回这些字母的所有组合即可。
整体解题思路如下:

  1. 因为输入字符串(digits)的长度可能为 0,所以首先特判如果 digits 为假,直接返回 [];
  2. 初始化数组 arr 存放数组对应的字母数组,初始化结果数组 res = [],初始化数字到字母的映射表 numToChars;
  3. 遍历输入字符串,将数字对应字母数组 pusharr 中;
  4. arr[0] 为初始结果,遍历 arr 中的每一个子数组,和结果数组中的每一项组成新的组合;
  5. 最后返回结果数组即可。

代码实现

var letterCombinations = function(digits) {
    if(!digits){
        return []
    }

    const arr = []
    let res = []
    const numToChars = {
        '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']
    }

    for(let i = 0;i<digits.length;i++){
        arr.push(numToChars[digits[i]])
    }

    res = arr[0]
    arr.shift()

    while(arr.length){
        const processArr = []

        for(let i = 0;i<arr[0].length;i++){
            for(let j = 0;j<res.length;j++){
                processArr.push(res[j]+arr[0][i])
            }
        }
        arr.shift()
        res = processArr
    }

    return res
}

至此我们就完成了 leetcode-17-电话号码的字母组合

如有任何问题或建议,欢迎留言讨论!