17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
思路:(参考代码随想录)
先把数字字母对应的映射关系写好
const letterMap = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
使用回溯法,回溯三部曲:
- 确定回溯函数的参数
(使用字符串s来存放单个叶子节点,数组res来收集所有的叶子结点) - 确定边界终止条件
(使用index记录遍历数字的个数,当index和digits长度相等时,便可以收集该分支的叶子节点) - 确定单层遍历的逻辑
(根据index找到对应字母放入,递归,回溯)
回溯法模版(来自代码随想录)
function backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
代码:
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function (digits) {
const letterMap = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
const n = digits.length;
if (n === 0) return [];
const res = [];
const s = []; //临时存放单个叶子结果
backtracking(digits, 0);
return res;
function backtracking(index) {
// index表示遍历第几个数字
if (index === n) {
res.push(s.join("")); //收集叶子结点的结果
return;
}
let digit = digits[index] - '0';
const letters = letterMap[digit];
for (let i of letters) {
s.push(i);
backtracking(index + 1);
s.pop(); //回溯
}
}
};