本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
解题思路
思路一
我们先将数字与字母的关系定义到散列表中,根据题目上已经写明了 digits 的长度范围在 1 到 4 之间,所以我们进行定义一个 combine 函数,处理长度在 4 以内的字母分组的组合工作,最后在将定义 flattenDeep 函数将最终的多维数组转换为一维数组即可
var letterCombinations = function(digits) {
if (!digits) return [];
const 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'],
};
const letters = digits.split('').map(l => map[l]);
const combine = (arrA, arrB, arrC, arrD) => arrA.map(a => {
if (!arrB) return a;
return arrB.map(b => {
if (!arrC) return a + b;
return arrC.map(c => {
if (!arrD) return a + b + c;
return arrD.map(d => a + b + c + d);
});
});
});
const flattenDeep = (arr) => Array.isArray(arr)
? arr.reduce( (a, b) => a.concat(flattenDeep(b)) , [])
: [arr];
return flattenDeep(combine(...letters));
};
思路二
我们先做一个hashMap,把数字和字母进行对应,然后再写helper函数,helprer(result, sb, digits), 在新建result数组并且做输入判断,如果digits为null或者长度为0,就返回result,然后新建字符串sb,调用helper函数,helper(result, sb, digits), 如果sb的长度和digits的长度相等,就把sb放到result里,进行返回,对于digits里的每一个数字,我们需要把他们都放到sb里,在去调用helper函数,helper(result, sb, digits),然后再删除sb的最后一个元素
function digitsToCharts(n) {
switch(n) {
case "2":
return ["a", "b", "c"]
case "3":
return ["d", "e", "f"]
case "4":
return ["g", "h", "i"]
case "5":
return ["j", "k", "l"]
case "6":
return ["m", "n", "o"]
case "7":
return ["p", "q", "r", "s"]
case "8":
return ["t", "u", "v"]
case "9":
return ["w", "x", "y", "z"]
default:
return []
}
}
var letterCombinations = function(digits) {
let result = []
if (digits == null || digits.length === 0) {
return result
}
let sb = ''
helper(result, sb, digits)
return result
};
let helper = function(result, sb, digits) {
if (sb.length === digits.length) {
result.push(sb)
return
}
for (let ch of digitsToCharts(digits[sb.length])){
sb = sb.concat(ch)
helper(result, sb, digits)
sb = sb.substring(0, sb.length - 1)
}
}