给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
/**
* 回溯 + dfs
* 时间复杂度:O(n^4)
* 空间复杂度:O(n)
*/
var letterCombinations = function (digits) {
if (!digits || !digits.length) return []
const map = {
2: 'abc',
3: 'def',
4: 'ghi',
5: 'jkl',
6: 'mno',
7: 'pqrs',
8: 'tuv',
9: 'wxyz',
}
const res = []
function dfs(str, i) {
if (i > digits.length - 1) {
res.push(str)
return
}
const letters = map[digits[i]]
for (const letter of letters) {
dfs(str + letter, i + 1)
}
}
dfs('', 0)
return res
}
/**
* 回溯 + bfs
* 时间复杂度:O(3^m×4^n)
* 空间复杂度:O(m+n)
*/
var letterCombinations = function (digits) {
if (!digits || !digits.length) return []
const map = {
2: 'abc',
3: 'def',
4: 'ghi',
5: 'jkl',
6: 'mno',
7: 'pqrs',
8: 'tuv',
9: 'wxyz',
}
const queue = ['']
for (let i = 0; i < digits.length; i++) {
const size = queue.length
for (let j = 0; j < size; j++) {
const str = queue.shift()
const letters = map[digits[i]]
for (const letter of letters) {
queue.push(str + letter)
}
}
}
return queue
}