leetcode17题
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]
#python解法(使用内置排列组合库)
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if len(digits)==0:return []
num_letter_map={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
return [''.join(x) for x in itertools.product(*(num_letter_map[x] for x in list(digits)))]
//javascript解法
export default (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)
}
API:
JS:
Array.prototype.splice(起始位置,替换掉的个数,用来替换的列表)
Python:
*()
元组拆包Python:
itertools.product
(要笛卡尔积的多个数组)Python:
"字符串".join(迭代序列)
思路和规律:
- 排列组合:递归+回溯
- 注意处理输入为空的情况