
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4digits[i] 是范围 ['2', '9'] 的一个数字。对于这种不同集合之间的组合,一开始会去想着,两个集合用两个for循环,三个集合三个for循环,但是我们无法去控制几个for循环,所以就想到用递归来控制for循环,再想到组合问题也需要用到回溯
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
//回溯
//用数组下标对应字符
const map = ["", "", "abc", "def", "ghi","jkl", "mno", "pqrs", "tuv", "wxyz"]
if(digits.length === 0) return []
if(digits.length === 1) return map[digits].split("")
//存储结果
const res = []
//单个结果
const path = []
const backtracking = (digits, index) => {
if(digits.length === path.length) {
//拼接起来
//ad
console.log(path)
res.push(path.join(''))
return
}
for(let i of map[digits[index]]) {
//['a', 'd']
path.push(i)
backtracking(digits, index + 1)
path.pop()
}
}
backtracking(digits, 0)
return res
};
时间复杂度:O(3 ^ m * 4 ^ m)
空间复杂度: O(n + k)
res 数组用于存储最终的字母组合,因此其空间复杂度是 O(k),其中 k 表示可能的字母组合数量。path 数组用于存储当前的组合路径,它的最大长度等于输入数字字符串的长度,因此其空间复杂度为 O(n),其中 n 表示输入数字字符串的长度。