leetcode(js)算法之17电话号码的字母组合

时间:2023-03-10 05:56:41
leetcode(js)算法之17电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母

leetcode(js)算法之17电话号码的字母组合

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

博主的(没有设置边界值):

const str = '23'
const numMap = new Map([[2,'abc'],[3,'def'],[4,'ghi'],[5,'jkl'],[6,'mno'],[7,'pqrs'],[8,'tuv'],[9,'wxyz']])
let combo = str => {
let strArr = str.split('')
console.log(strArr)
let temArr = []
strArr.map(item => {
temArr.push(numMap.get(parseInt(item)))
})
console.log(temArr)
temArr = temArr.map(item => {
return item.split('')
})
let len = temArr.length
for (let x=0;x<=len-1;x++) {
handle(temArr[0],temArr[1])
if(temArr.length>2) {
temArr.splice(0,2,handle(temArr[0],temArr[1]))
}else {
return handle(temArr[0],temArr[1])
break
}
}
}
function handle(a, b){ let arr = []
a.map(char => {
b.map(char2 => {
arr.push(char+char2)
})
})
return arr
} console.log(combo(str).length)

老师的:

export default (str) => {
// 建立电话号码键盘映射
let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
// 把输入字符串按单字符分隔变成数组,234=>[2,3,4]
let num = str.split('')
// 保存键盘映射后的字母内容,如 23=>['abc','def']
let code = []
num.forEach(item => {
if (map[item]) {
code.push(map[item])
}
})
let comb = (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 {
return tmp
}
return arr[0]
}
return comb(code)
}