【LeetCode刷题记录】17. 电话号码的字母组合(JS解法)

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"];

在这里插入图片描述

使用回溯法,回溯三部曲:

  1. 确定回溯函数的参数
    (使用字符串s来存放单个叶子节点,数组res来收集所有的叶子结点)
  2. 确定边界终止条件
    (使用index记录遍历数字的个数,当index和digits长度相等时,便可以收集该分支的叶子节点)
  3. 确定单层遍历的逻辑
    (根据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(); //回溯
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值