问题描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例2:
输入:digits = "2"
输出:["a","b","c"]
解题思路:回溯算法
- 假如输入数据为digits = ‘23’, 会有以下组合
- 这类似于一个树结构,可以用回溯算法查找所有路径
- 回溯算法的模板:
function backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
代码实现(js)
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
// 1.边界处理
if(digits.length === 0){
return []
}
// 2.定义数字到字母的映射
let digitsOnLetters = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
// 定义结果
let res = []
// 3.回溯算法主函数(path:当前访问的路径,start: 当前访问数字的下标)
const dfs = (digits, path, start) => {
// 到达回溯树底部
if (path.length === digits.length) {
res.push(path.join(''))
return
}
for (let i = start; i < digits.length; i++) {
let digit = digits[i]
for (let c of digitsOnLetters[digit]) {
// 做选择
path.push(c)
// 递归下一层回溯树
dfs(digits, path, i + 1)
// 撤销选择
path.pop()
}
}
}
// 4.调用回溯函数
dfs(digits, [], 0)
return res
};