17. 电话号码的字母组合回溯Normal

Posted pre_eminent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17. 电话号码的字母组合回溯Normal相关的知识,希望对你有一定的参考价值。

题目

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'] 的一个数字。

 

思路:

1. 使用map记录数字与字母的映射关系

2. 按照 78题的回溯模板

3. 回溯函数使用参数startIndex

4. 回溯函数到达叶子节点时 将path添加到结果集res中后,return

5. 根据startIndex取出数字,再从map中获取对应的字母,即所有的选择


 

解答:

/**
 * @param string str
 * @return string[]
 */
var letterCombinations = function(str) 
    // 健壮性判断
    if (str === "") 
        return [];
    
    // 初始位置从0开始
    let startIndex = 0;

    // 存放结果集
    let res = [];
    // 策略树到叶节点时,添加到结果集
    let path = [];
    // 辅助map
    let map = new Map();
    map.set("2", "abc");
    map.set("3", "def");
    map.set("4", "ghi");
    map.set("5", "jkl");
    map.set("6", "mno");
    map.set("7", "pqrs");
    map.set("8", "tuv");
    map.set("9", "wxyz");
    backtrack(str, startIndex, path, res, map);
    return res;
;

function backtrack(str, startIndex, path, res, map) 
    // 当到达叶结节时,添加到结果集
    if (path.length === str.length) 
        res.push(path.join(''));
        return;
    

    // 找出"23"的第1个字符"2" 对应的字母"abc"
    let ch = str[startIndex];
    let choices = map.get(ch);
    // 遍历所有选择
    for (let i = 0; i < choices.length; i++) 
        let alpha = choices[i];
        // 做出选择
        path.push(alpha);
        // 进入下一层
        backtrack(str, startIndex + 1, path, res, map);
        // 撤销选择
        path.pop();
    

以上是关于17. 电话号码的字母组合回溯Normal的主要内容,如果未能解决你的问题,请参考以下文章

17. 电话号码的字母组合(递归+回溯)

leetcode 17. 电话号码的字母组合----回溯算法

17. 电话号码的字母组合(回溯/DFS)

[LeetCode] 17. 电话号码的字母组合(回溯)

17. 电话号码的字母组合(回溯/DFS)

[回溯算法]leetcode17. 电话号码的字母组合(c实现)