leetcode:17 电话号码的字母组合
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(str) {
// 对输入做处理,如果小于1返回空(LeetCode测试用例)
if (str.length < 1) return []
// 建立电话号码键盘映射
let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
// 如果只给了一个按键,直接把按键内容取出来并按单个字符分组就可以了(LeetCode测试用例)
if (str.length < 2) return map[str].split('')
// 把输入字符串按单字符分隔变成数组,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)
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
题目理解:
2~9相对应的映射到的字母,获得它所能组成的(((所有的)))字母组合.注意,1什么都没有,1不用算.
比如输入的是23,就是2与3进行组合,并且组合成的数组每一个数组的下标是两个字符的。。。。。
例如输入234,那就是先23进行组合,组合成的数组又与4进行组合,然后输出的每一个数组1的下标是3个。以此类推。。。。。
思路;先联系好所在的数字锁映射到的字母先.
然后是数字2与数字3运算然后组合,然后组成成的(2 3)新数组与4算,然后又组成新(234)一个数组与5算(这样一来都是两两算。)…就行了.
解题步骤:
先映射:
let map = [’’, 1, ‘abc’, ‘def’, ‘ghi’, ‘jkl’, ‘mno’, ‘pqrs’, ‘tuv’, ‘wxyz’]
把输入的数字映射(对应)到相对应的字母.
if (str.length < 1) return []
// 建立电话号码键盘映射
let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
// 如果只给了一个按键,直接把按键内容取出来并按单个字符分组就可以了(LeetCode测试用例)
if (str.length < 2) return map[str].split('')
// 把输入字符串按单字符分隔变成数组,234=>[2,3,4]
let num = str.split('')
// 保存键盘映射后的字母内容,如 23=>['abc','def']
let code = []
num.forEach(item => {
if (map[item]) {
code.push(map[item])
}
})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
num.forEach(item => {
if (map[item]) {
code.push(map[item])
}
})
- 1
- 2
- 3
- 4
- 5
这一句是把num也就是输入的数字遍历一下,然后判断map中的下标有没有与输入的一样的数字啊。
有就push进code里,code有什么作用?保存键盘映射后的字母内容
然后是下面是进行组合了.(代码)
// 临时变量用来保存前两个组合的结果
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
核心代码:(两个两个组合的代码)
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]}`)
}
}
- 1
- 2
- 3
- 4
- 5
arr.splice(0, 2, tmp)
- 1
这一句是用tmp这一个替换相组合的两个。
然后tmp这个临时的变量继续与下一个进行组合.
let tmp = []
- 1
为什么tmp是临时的变量,因为他的数据会变化的。
然后通过递归继续与第三个。。。输入的进行组合.
一些条件:
if (arr.length > 1) {
comb(arr)
} else {
return tmp
}
- 1
- 2
- 3
- 4
- 5
为什么,因为最后只剩下一个下标了哈(组合输入的全部完的基础上)
完成…
文章来源: blog.csdn.net,作者:贵哥的编程之路(陈业贵),版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_37805832/article/details/107586089
- 点赞
- 收藏
- 关注作者
评论(0)