LeetCode 热题 HOT — 电话号码的字母组合

140 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 5 天,点击查看活动详情

电话号码的字母组合

原题地址

给定一个仅包含数字 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'] 的一个数字。

思路分析

  1. 首先定义一个 map 来存储每个数字对应的字母数组;
  2. 提示中表示 0 <= digits.length <= 4,因此可以分类处理;
  3. digits.length = 0 时,返回 [];
  4. digits.length = 1 时,返回 map 中对应的数组即可;
  5. digits.length = 2 时,两次循环,返回对应的拼接字符串;
  6. digits.length 为 3、4 时,分别循环三四次,返回对应的拼接字符串;
  7. 一个很粗暴的解法,但是在执行测试用例时,耗时还不算太长。

AC 代码

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    const oriMap = {
        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']
    }
    let res = []
    switch(digits.length) {
        case 0:
            res = []
            break
        case 1:
            res = oriMap[digits]
            break
        case 2:
            for(let i = 0; i < oriMap[digits[0]].length; i++) {
                for(let j = 0; j < oriMap[digits[1]].length; j++) {
                    res.push(`${oriMap[digits[0]][i]}${oriMap[digits[1]][j]}`)
                }
            }
            break
        case 3:
            for(let i = 0; i < oriMap[digits[0]].length; i++) {
                for(let j = 0; j < oriMap[digits[1]].length; j++) {
                    for(let k = 0; k < oriMap[digits[2]].length; k++) {
                        res.push(`${oriMap[digits[0]][i]}${oriMap[digits[1]][j]}${oriMap[digits[2]][k]}`)
                    }
                }
            }
            break
        case 4:
            for(let i = 0; i < oriMap[digits[0]].length; i++) {
                for(let j = 0; j < oriMap[digits[1]].length; j++) {
                    for(let k = 0; k < oriMap[digits[2]].length; k++) {
                        for(let l = 0; l < oriMap[digits[3]].length; l++) {
                            res.push(`${oriMap[digits[0]][i]}${oriMap[digits[1]][j]}${oriMap[digits[2]][k]}${oriMap[digits[3]][l]}`)
                        }
                    }
                }
            }
            break
    }
    return res
    
};

结果:

  • 执行结果: 通过
  • 执行用时:56 ms, 在所有 JavaScript 提交中击败了86.81%的用户
  • 内存消耗:41.1 MB, 在所有 JavaScript 提交中击败了36.69%的用户
  • 通过测试用例:25 / 25

END