• 力扣(LeetCode)17. 电话号码的字母组合(C++)


    回溯

    2 2 2—— 9 9 9 和字母对应起来,用字符串数组保存。

    递归遍历 d i g i t s digits digits 每一个数字,每一个数字对应的字母,又可以递归遍历,和下一个数字的字母组成排列。当排列长度等于 d i g i t s digits digits 的长度,就组成了一个排列。

    d f s dfs dfs 树 , 以 d i g i t s = 2 / 3 / 4 digits = 2/3/4 digits=2/3/4 为例
    DFS
    只画出了部分 d f s dfs dfs 树, b b b c c c 的子树可以参考 a a a ,一共 3 3 = 27 3^3=27 33=27 种组合。

    代码展示
    class Solution {
    public:
        string strs[10]{
            "","","abc","def",
            "ghi","jkl","mno",
            "pqrs","tuv","wxyz",
        };
        vector<string> ans ;
        vector<string> letterCombinations(string digits) {//回溯法
            if(digits.empty()) return ans;//输入空,返回空。
            dfs(digits,0,"");
            return ans;
        }
        void dfs(string digits, int u , string path){//u在path对应第几个字符。
            if(u==digits.size()) ans.push_back(path);
            else{
                for(char &x:strs[digits[u]-'0'])//u在digits对应第几个数字。
                    dfs(digits,u+1,path+x);
            }
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    博主致语

    理解思路很重要!
    欢迎读者在评论区留言,作为日更博主,看到就会回复的。

    AC

    AC

    复杂度分析
    1. 时间复杂度: O ( 4 n × n ) O(4^n\times n ) O(4n×n) n n n d i g i t s digits digits 的长度 , 每个数字最多对应 4 4 4 个字母 , 递归组合,最坏时间复杂度 O ( 4 n ) O(4^n) O(4n) p u s h _ b a c k push\_back push_back 的时间复杂度 O ( n ) O(n) O(n) ,综上,最坏时间复杂度 O ( 4 n ) O(4^n) O(4n)
    2. 空间复杂度: O ( n ) O(n) O(n),压栈最大深度 n n n ,对应的空间复杂度 O ( n ) O(n) O(n)
  • 相关阅读:
    SpringMVC处理Ajax请求及处理和响应json格式的数据
    XDOJ-360 结点在二叉排序树的位置
    from * import * 和 import *
    后端接口性能优化分析
    C语言小游戏之扫雷(万字详解)
    【RV1103】如何新增一个新板级配置
    python+java+SSM+vue勤工助学管理系统#计算机毕业设计
    【解决】自定义conda环境安装位置,三种解决方法
    使用jupyter的一些常识
    内核态和用户态
  • 原文地址:https://blog.csdn.net/Innocence02/article/details/127939020