题目链接: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']
的一个数字。
文章讲解:代码随想录
视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili
题解1:回溯法
思路:使用回溯法来求解组合问题。
回溯分析:
- 递归函数的参数和返回值:首先创建2个变量 res 和 path,path 记录遍历的路径,res 记录结果。递归函数的返回值为 void,参数是 index,用来记录当前遍历的 digits 的下标。
- 递归函数的终止条件:找到叶子节点,即 path 的长度和 digits 的长度相同,也就是找到了一个符合题目要求的组合,将这个组合存入结果数组。
- 单层递归的逻辑:使用 for 循环横向遍历 digits[index] 对应的字母集合,同时递归的向下纵向遍历寻找组合。
- 剪枝:无。
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
if (!digits) {
return [];
}
const map = [[], [], ["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["p", "q", "r", "s"], ["t", "u", "v"], ["w", "x", "y", "z"]];
const res = []; // 结果数组
const path = []; // 路径
const backtracking = function (index) {
if (path.length === digits.length) {
res.push(path.join("")); // 如果路径长度和传入的数字字符串长度相等,说明找到一条符合题目要求的路径,加入到结果数组,然后fanh
return;
}
for (let i = 0; i < map[digits[index]].length; i++) {
path.push(map[digits[index]][i]); // 记录路径
backtracking(index + 1); // 继续向下遍历
path.pop(); // 回溯
}
}
backtracking(0);
return res;
};
分析:令 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数,则时间复杂度为 O(3 ^ m * 4 ^ n),空间复杂度为 O(m + n)。
收获
练习使用回溯法解决组合问题。