一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 5 天,点击查看活动详情。
电话号码的字母组合
给定一个仅包含数字 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 <= 4digits[i]是范围['2', '9']的一个数字。
思路分析
- 首先定义一个 map 来存储每个数字对应的字母数组;
- 提示中表示
0 <= digits.length <= 4,因此可以分类处理; - digits.length = 0 时,返回 [];
- digits.length = 1 时,返回 map 中对应的数组即可;
- digits.length = 2 时,两次循环,返回对应的拼接字符串;
- digits.length 为 3、4 时,分别循环三四次,返回对应的拼接字符串;
- 一个很粗暴的解法,但是在执行测试用例时,耗时还不算太长。
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