当前位置: 首页 > news >正文

电话号码的字母组合

一:题目

二:思路

①:用递归解决,因为这就是一个多叉树的深度优先遍历

②:递归函数的参数:

参数1:digits,也就是"23"这种已知条件

参数2:一个整形叫作di,用来表示digits的下标,以便获取每个电话号码对应的字符串

参数3:一个字符串cbstr,用来表示每次递归得到的字符串

参数4:题目返回的是一个vector<string>,也就是一个字符串数组,所以我们单次递归到终点得到的结果应该被push_back进这个数组中,所以参数还有一个vector<string>类型的对象

三:代码解析

 解释:

①:参数digits用引用传递,是单纯的省略拷贝,也可以不用

②:d1不能用引用传递和取地址传递,因为当递归返回时,需要撤销上一步的修改(即回溯)

③:cbstr也是和②一样,当递归返回时,需要撤销上一步的修改(即回溯),以便尝试其他可能的字母,

如果 cbstr 是引用传递:

        每次递归调用都会修改同一个 cbstr 对象。

        当递归返回时,cbstr 的状态已经被修改,无法正确回溯。

且cbstr 在函数中用+不能用+=,因为不能影响自身,当递归返回时,需要撤销上一步的修改(即回溯),以便尝试其他可能的字母,

④:v必须引用传递,因为该值从递归深回到递归浅层次的时候,依旧要保留上一次递归到最深处所push_back的字符串

如果 v 不使用引用传递:

        每次递归调用都会创建一个新的 v 副本。

        递归调用中对 v 的修改(例如 v.push_back(cbstr))只会作用于副本,而不会影响原始          的 v

        最终,原始的 v 仍然是空的,无法得到正确的结果。

四:源码

class Solution {
public:
    //一个字符串数组来让电话号码作为下标精准对应字符串   两个空字符串让2对准了"abc"
    string Num_To_Str[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

    void Combine(string& digits,int di,string cbstr,vector<string>& v)
    {
        if(di == digits.size())//表明digits这个数组已经被遍历完成,目前是超过的一次,
        {                      //也就是说:该次递归已达最深,得到一个完全的字符串,将其push_back进v中
            v.push_back(cbstr);
            return ;
        }

        int i = digits[di]-'0';//获取digits这个字符串里面的字符 -'0'转换为int值,得到单个电话号码
        string  str = Num_To_Str[i];//将电话号码作为Num_To_Str下标得到对应的字符串

        for(int j=0; j<str.size(); j++)//电话号码对应的字符串会在整个递归的过程中逐渐被全部遍历
        {
            
            Combine(digits,di+1,cbstr+str[j],v);
        }   //              下标+1   cbstr字符串获取到了每次该获取到的一个字符

    }
    vector<string> letterCombinations(string digits) {
        vector<string> v;//v是最后的返回值 该字符数组存储了类似["ad","ae","af","bd","be","bf","cd","ce","cf"]的值
        if(digits.empty())//如果电话号码都没有
        return v;则返回v

        Combine(digits,0,"",v);//第一次调用递归函数
        
        return v;
    }
};

相关文章:

  • 数据结构--AVL树
  • 2020年联考《申论》第三题(河北县级卷)
  • ACM MM 2025 Overleaf 模板指导
  • swift -(5) 汇编分析结构体、类的内存布局
  • C++编程指南24 - 避免线程频繁的创建和销毁
  • Git系列之git tag和ReleaseMilestone
  • 23年以后版本pycharm找不到conda可执行文件解决办法
  • 使用 ResponseBodyEmitter 实现异步响应式数据流处理
  • 工程化与框架系列(24)--跨平台解决方案
  • 3.8【Q】cv
  • AWS 如何导入内部SSL 证书
  • VsCode导入时选择相对路径
  • 伊藤积分(Ito Integral):随机世界中的积分魔法
  • Windows下配置Conda环境路径
  • C语言中内存布局(内存模型)是怎样的?
  • 一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型
  • 仿真新能源充电桩管理系统
  • Linux16-数据库、HTML
  • 人工智能(AI)与 生命体智能的本质差异
  • Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!
  • 手机wordpress教程/seo管理系统创作
  • 网站开发语言java和php/做百度推广销售怎么样
  • 360浏览器最新版本下载安装/优化推广网站推荐
  • 设计方案网站/网站怎么推广效果好一点呢
  • 专家称第二波疫情风暴会很低/北京seo包年
  • 政府网站建设汇报材料/推客平台