「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
大家好今天给大家分享下一道 LeetCode 中等难度 的题目[17. 电话号码的字母组合]
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
分析
1.每个数字都对应一个字母集合,只包含2-9的数字
2.每个组合中 必须选取每个数字对应的字母集合中的一个
3.返回包含各种组合的数组
解法
1.递归
解法一:递归
思想
1.首先创建一个字典包含数组和字母的映射关系
2.在每层递归中做如下几步骤
1.终止条件 对应的cur的索引和digits的位数相同的时候就为就为所需要的组合之一 放入res中
2.在索引cur的基础上取出当前digits[cur]中对应的 字母数组
3.然后遍历字母数组,把字母加入arr中,索引cur+1
3.最后返回res数组
*/
var letterCombinations = function (digits) {
if (!digits) return [];
// 初始化字典
const dic = {
2: ["a", "b", "c"],
3: ["d", "e", "f"],
4: ["g", "h", "i"],
5: ["j", "k", "l"],
6: ["m", "n", "o"],
7: ["p", "q", "r", "s"],
8: ["t", "u", "v"],
9: ["w", "x", "y", "z"],
};
const res = [];
// 把输入的数字拆分成数组
const digitsArr = digits.split("");
function recur(arr, cur) {
// 对应的cur的索引和digits的位数相同的时候就为就为所需要的组合之一
if (cur === digitsArr.length) {
res.push(arr.join(""));
return;
}
// 在索引cur的基础上取出当前digits[cur]中对应的数组
const digit = digitsArr[cur];
const letters = dic[digit];
// 遍历字母数组,把字母加入arr中,索引cur+1
for (let j = 0; j < letters.length; j++) {
const letter = letters[j];
recur([...arr, letter], cur + 1);
}
}
recur([], 0);
return res;
};
/* 复杂度
时间 O(3^m x 4^m) m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数
空间 O(m+n)
*/
总结
今天这道题是主要是练习使用递归来求解生成组合的这类题目
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com