题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
解题思路:先找规律,可以发现,我们可以认为是两两组合。比如输入“234”,[“abc”,“def”,“ghi”],先计算2和3组合成一个新数组[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”],将新数组再与“ghi”结合,递归下去,知道最后结果数组中只有一个元素。可以写一个递归函数来实现。
注意:LeetCode上刷题,必须考虑输入为空的情况(太坑了!!!)
var letterCombinations = function(digits) {
// 建立map和num两个数组,用来一一对应
let map=["",1,"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
if(digits.length == 0){
return [];
}
if(digits.length == 1){
return map[parseInt(digits)].split("");
}
let num=digits.split("")
let code=[]
num.forEach(item=>{
if(map[item]){
code.push(map[item])
}
})
let comb=function(arr){
let tmp=[]
for(let i=0,il=arr[0].length;i<il;i++){
for(let j=0,jl=arr[1].length;j<jl;j++){
tmp.push(`${arr[0][i]}${arr[1][j]}`)
}
}
arr.splice(0,2,tmp)
if(arr.length>1){
comb(arr)
}else{
console.log(tmp)
return tmp
}
return arr[0]
};
return comb(code);
};