Appearance
17. 电话号码的字母组合
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
**输入:**digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
**输入:**digits = "2" 输出:["a","b","c"]
提示:
- `1 <= digits.length <= 4`
- `digits[i]` 是范围 `['2', '9']` 的一个数字。
难度: Medium
题解代码
javascript
/**
* @param {string} digits
* @return {string[]}
*/
// 递归方法
// const letterCombinations = digits => {
// if (!digits.length) return []
// if (digits.length === 1) return map[digits].split('')
// const map = {
// '2': 'abc',
// '3': 'def',
// '4': 'ghi',
// '5': 'jkl',
// '6': 'mno',
// '7': 'pqrs',
// '8': 'tuv',
// '9': 'wxyz'
// }
// const ret = []
// digits.split('').forEach(item => {
// ret.push(map[item])
// })
// const comb = arr => {
// const left = Array.isArray(arr[0]) ? arr[0] : arr[0].split('')
// const right = arr[1]
// const newItem = []
// // 合并数组的第一个项,并替换掉第一二项
// for (let i = 0; i < left.length; i ++) {
// for (let j = 0; j < right .length; j++) {
// newItem.push(left[i] + right[j])
// }
// }
// arr.splice(0, 2, newItem)
// // 递归执行所有项
// if (arr.length > 1) {
// comb(arr)
// }
// }
// comb(ret)
// return ret[0]
// };
const map = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
}
var letterCombinations = digits => {
if (!digits.length) return []
const ret = []
backTrack(ret, '', digits)
return ret
}
function backTrack (ret, path, digit) {
if (!digit.length) {
return ret.push(path)
}
const letters = map[digit[0]]
for (let i = 0; i < letters.length; i++) {
path += letters[i]
backTrack(ret, path, digit.slice(1))
path = path.slice(0, -1)
}
}