LeetCode算法学习之--递归--17.电话号码的字母组合

232 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

大家好今天给大家分享下一道 LeetCode 中等难度 的题目[17. 电话号码的字母组合]

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

image.png

分析

1.每个数字都对应一个字母集合,只包含2-9的数字

2.每个组合中 必须选取每个数字对应的字母集合中的一个

3.返回包含各种组合的数组

解法

1.递归

解法一:递归

思想
1.首先创建一个字典包含数组和字母的映射关系
2.在每层递归中做如下几步骤
 1.终止条件 对应的cur的索引和digits的位数相同的时候就为就为所需要的组合之一 放入res中
 2.在索引cur的基础上取出当前digits[cur]中对应的 字母数组
 3.然后遍历字母数组,把字母加入arr中,索引cur+13.最后返回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