问题描述

思路
递归的思想,两两组合,直到最后只剩下一个
代码
export default (str) => {
// 电话号码键盘映射
let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
let numArr = str.split('');
let codeArr = [];
numArr.forEach(item => {
if(map[item]){
codeArr.push(map[item])
}
})
let comb = (arr) => {
// 考虑边界情况
if(!arr) return [];
if(!arr[1]) return arr.split("");
let temp = [];
for(let i=0, il=arr[0].length; i<il; i++){
for(let j=0,jl=arr[1].length; j<jl; j++){
temp.push(`${arr[0][i]}${arr[1][j]}`)
}
}
arr.splice(0,2,temp); // 前两个组合完成之后,将temp数组代替前两个数组,再与第三个字符串
// 如果还有多余的项,就继续递归,直到还剩下一个元素,将临时数组返回即可
if(arr.length > 1){
comb(arr)
}else{
return temp
}
return arr[0]
}
return !str ? [] : comb(codeArr)
}
大神代码:
var letterCombinations = function(digits) {
const map = ['',1,['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']]
const code = digits.split('').map(v => map[v]) // 返回二维数组
return !digits ? [] :
code.reduce((acc, cur) => [].concat(...acc.map(v => cur.map(j => `${v}${j}`))))
}
网友评论