• leetcode17. 电话号码的字母组合




    题目

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

    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
    在这里插入图片描述

    在这里插入图片描述

    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思考

    • 1、使用递归回溯的方式来获取组合
    • 2、之前我们都是在一个数组中完成递归,那两个数组我们就在这题就不需要startIdx来控制到递归的位置了
    • 3、我们在定义递归参数的时候特别要注意
    • 4、你想清楚这一题的树型结构了吗【其实是每个按键组成的是一层】

    代码和注释

    /**
            使用回溯法
            1、确定递归函数的参数
            2、结束条件
            3、每轮递归干的事
         */
    class Solution {
        // 临时路径字符串
        StringBuilder pathStr = new StringBuilder();
        // 存放结果集
        List<String> res = new ArrayList<>();
    
    
        
        public List<String> letterCombinations(String digits) {
            // 极端判断
            if(digits == null || digits.length()== 0){
                return res;
            }
            // 定义一个数组来存放字母
            String[] numToVal = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    
            backtacking(digits, numToVal, 0);
            return res;
        }
        // num 是用来标记digits的下标位置的(控制只要num个元素即可)
        public void backtacking(String digits, String[] numToVal, int num){
            // 终止条件(由题目可知,我们由几个数组,就要组合成多少个元素)
            // num控制的是for循环,也就是深度
            if(digits.length() == num){
                // 收集结果
                res.add(pathStr.toString());
                return;
            }
            // 每轮递归需要干的事
            // 获取我们在按的每个数字(ascii计算的)
            String str = numToVal[digits.charAt(num) - '0'];
            // str.length()这个控制的是每一层的宽度 
            for(int i = 0; i<str.length(); i++){
                pathStr.append(str.charAt(i));
                backtacking(digits, numToVal, num + 1);
                // 回溯
                pathStr.deleteCharAt(pathStr.length() - 1);
    
            }
    
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    总结

    • 1、做到这题的时候对回溯有了一些新的理解
      • a:我们使用的for循环里面的条件其实就是我们每一层树节点的宽度
      • b:我们对递归的终止条件就是深度【其实就等价于我们目标值的长度,所有我们到对应的深度得到对应的深度的值,就没必要在向下递归来获取新的值了】
  • 相关阅读:
    机器学习python实践——关于ward聚类分层算法的一些个人心得
    英语词典缩略词
    使用node-pty报错Uncaught Error: This socket has been ended by the other party
    【李宏毅机器学习】自编码器auto-encoder
    造轮子之集成GraphQL
    教你一步一步手撕Promise
    五.Dockerfile文件编写的常用指令记录解释
    【跟小嘉学 Rust 编程】二十三、Cargo 使用指南
    【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    Stream之实现原理分析
  • 原文地址:https://blog.csdn.net/weixin_46643875/article/details/128005411