LeetCode题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

解题思路:

  1. 假设输入是'23',那么就需要在'2'对应的字母映射'abc'中分别选取一个。再以此为基础,从'3'对应的字母映射'def'中选取一个,组合成最终结果。
  2. 由于输入的数字并不确定长度,因此选择用递归的方式遍历digits
  3. 每层递归处理的都通过参数current,选择当前需要处理的字母映射。
  4. 在递归中利用for循环遍历字母映射,逐个完成对字母的选中,之后下探到下层递归,处理下一个数字。
/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function (digits) {
  // 如果传入digits为空,则直接返回结果[]
  if (!digits || !digits.length) {
    return [];
  }

  // 使用Map存储按键对应的字母
  const map = new Map([
    ['2', 'abc'],
    ['3', 'def'],
    ['4', 'ghi'],
    ['5', 'jkl'],
    ['6', 'mno'],
    ['7', 'pqrs'],
    ['8', 'tuv'],
    ['9', 'wxyz'],
  ]);
  // 存储最终结果
  let result = [];

  // 回溯生成所有的字符串组合
  function backtrack(str, current) {
    // 递归终止条件
    // 当生成的字符串长度等于输入长度时,表示生成完毕,储存结果并退出循环。
    // 若不退出,由于current已经超出了digits长度,会因map.get获取值为空而报错。
    if (str.length === digits.length) {
      result.push(str);
      return;
    }

    // 当前层递归逻辑
    // 从Map中获取当前输入的数字映射的字母
    const digit = map.get(digits[current]);

    // 遍历当前映射的字符串,生成不同组合
    for (let i = 0; i < digit.length; i++) {
      // 下探到下层递归
      // 在当前字符串中选取一个字母,进入下一层递归的选择
      backtrack(str + digit[i], current + 1);
    }
  }

  // 回溯生成组合,初始状态str为空,current为0
  backtrack('', 0);

  return result;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值