• 电话号码的字母组合 C++ 回溯递归


    目录

    题目描述

    超时代码+分析:四层for循环

    AC代码+分析:回溯递归


    题目描述

    给定一个仅包含数字 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'] 的一个数字。

    超时代码+分析:四层for循环

    一开始,按照传统思路,我给它来了一个四层循环,外两层循环变换字符串,内两层循环拼接字符串,然后本地可以出结果,leetcode上就运行超时。然后就只能用算法解决了。

    1. class Solution {
    2. public:
    3. vector letterCombinations(string digits) {
    4. string code[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}, temp;
    5. vectoranswer,topick;
    6. for(auto & it:digits)topick.push_back(code[it-'2']);
    7. for(int i=0;isize()-1;i++)
    8. for(int j=i+1;jsize();j++)
    9. for(auto & it:topick[i])
    10. for(auto & itit:topick[j]){
    11. temp.clear();
    12. temp.insert(temp.end(),it);
    13. temp.insert(temp.end(),itit);
    14. answer.push_back(temp);
    15. }
    16. return answer;
    17. }
    18. };

    AC代码+分析:回溯递归

    类似与树和图的结构;请看图片:

     如果不用算法,暴力解决的话,理论上有几个字符串,就需要几个循环嵌套。

    所以我们可以用深度优先的回溯来解决这个问题,详情看代码注释。

    1. class Solution {
    2. public:
    3. string code[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//设置为类数据,方便调用,不需要传太多参数
    4. vector<string>answer;
    5. string digit;//方便调用,不需要传参数
    6. void backtrack(string temp,int depth) {
    7. if(depth==digit.size())answer.push_back(temp);//如果层数与数字的个数,即总字符串数相同,说明这一枝拼接完毕
    8. else{
    9. string temptemp=code[digit[depth]-'2'];//提取数字对应的字符串
    10. for(auto it:temptemp)backtrack(temp+it,depth+1);//对于每一个子节点,拼接下一层
    11. }
    12. }
    13. vector<string> letterCombinations(string digits) {
    14. digit=digits;//拷贝一份digits
    15. if(digit.size()==0)return {};//空输入返回空字符串
    16. backtrack("",0);//调用
    17. return answer;
    18. }
    19. };
  • 相关阅读:
    nodejs安装和环境配置-Linux
    [论文阅读] SADGA: Structure-Aware Dual Graph Aggregation Network for Text-to-SQL
    FPGA面试题
    Linux——进程控制
    网络应用层之(1)DHCPv6协议
    LeetCode 646 最长数对链[贪心 自定义排序] HERODING的LeetCode之路
    【Arduino+ESP32专题】案例:串口接收字符串并按指定分隔符分割
    安装dai li
    服务器性能测试监控平台export+prometheus(普罗米修斯)+grafana搭建
    易点易动助力企业设备高效管理,提升设备利用率
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/126297475