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

leetcode 17. 电话号码的字母组合

在这里插入图片描述

  1. 先审题,给一个数字字符串,要求返回一个字符串数组,里面包含:所有能表示的字母组合。
  2. 举例:数字字符串为:“23”,2对应:“abc”,3对应“def”;那么字母组合有:ad,ae,af,bd,be,bf
    ,cd,ce,cf。
  3. 画图实现:

(1)首先需要完成数字和字母的映射关系
可以用一个字符串数组,完成绝对映射:

 string arr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

arr[2]=“abc”;arr[3]=“def”。
(2)以输入“23”为例,画图
在这里插入图片描述
在这里插入图片描述
a会和def都组合,形成的“ad”==输入的数字字符的大小,说明这个"ad"就是最终形成的字母组合,然后返回,再和“ae”组合,返回后,再和“af”组合,再返回;走到这里说明已经完成了一趟,接下来是b和def的组合,最后是c和def的组合;这个我们可以用一个for循环控制。

  1. 代码实现:
 class Solution {
 public:
 //映射关系
    string arr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
 //递归函数
    void AZ(string digits,size_t n,string comb,vector<string>&str)
    {
       if(n==digits.size())
       {
           str.push_back(comb);
           return;
       }
       string _str=arr[digits[n]-'0'];
       for(size_t i=0;i<_str.size();i++)
       {
           AZ(digits,n+1,comb+_str[i],str);
       }  
    }
    
    vector<string> letterCombinations(string digits)
    {
      //返回的字符串数组
      vector<string> ret_str;
      //如果为数字数组为空,直接返回上面的空数组
      if(digits.empty())
      {
          return ret_str;
      }
      //comb用于存临时形成的字母组合
      string comb;
      //AZ函数
      AZ(digits,0,comb,ret_str);
      return ret_str;
    }
};

具体实现AZ函数。

void AZ(string digits,size_t n,string comb,vector<string>&str);

(1)参数:digits存的数字字符串,n用于记录递归的深度,comb用于存形成的字母组合,str要存所有形成的字母组合(str是引用传参)。
注意:用digits=“258”举例。

(2)digits=“258”,那么它的递归深度就是3,也就是digits.size()。所以当n==digits.size()时,说明最终字母组合形成,将comb拷贝进str,并返回到上一层。

     if(n==digits.size())
       {
           str.push_back(comb);
           return;
       }

(3)需要一个字符串来存数字对应的字母;

string _str=arr[digits[n]-'0'];

一上来n=0,那么_str=arr[digits[0]-‘0’]=arr[2]=“abc”;
(4)实现字母的组合,

       for(size_t i=0;i<_str.size();i++)
       {
           AZ(digits,n+1,comb+_str[i],str);
       }  

用for循环控制边界,注意是i<_str.size(),往下递归深度要加1,comb要加一个字母。
(5)画图理解AZ()。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
返回上一级,也就是“ak”层,str里面已经有了一个字母组合“akt”。
在这里插入图片描述
继续往下走,
在这里插入图片描述
所以这次,str里还会加进去一个字母组合“aku”。然后再返回上级,comb+_str[2]=“akv”,也就会再加一个字母组合“akv”,然后再返回,因为上一层的for循环走完了,所以再返回它的上一级。也就是a层,再组成”aj“往下递归。
在这里插入图片描述
对,画到这里,想必大家已经明白了。


相关文章:

  • 怎样平衡软件质量与时间成本范围的关系?
  • Odoo | 开源ERP,解锁审计和日志记录新玩法
  • c++STL 迭代器失效的三种情况总结
  • cordova 打包android app
  • 【稀里糊涂学Spring MVC】Filter
  • HK-WEKA如何为勒索软件保护和业务连续性提供支持?
  • springboot+mybaties-plus自动建表
  • 企业IP地址跟踪
  • C++ 小游戏 视频及资料集(3)
  • 十、ThreadPoolExecutor 手撕核心源码
  • Refind多引导系统界面
  • 变身小小科学家 南瓜科学让孩子爱上实验
  • 分布式之ZooKeeper概述
  • app毕业设计开题报告基于Uniapp实现的移动端的医生寻访平台计算机毕业设计
  • 分布式链路追踪技术 Sleuth +Zipkin
  • 【Leetcode】101. 对称二叉树
  • 2017届校招提前批面试回顾
  • django开发-定时任务的使用
  • ES6--对象的扩展
  • es的写入过程
  • MySQL-事务管理(基础)
  • Octave 入门
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue全家桶实现一个Web App
  • 编写高质量JavaScript代码之并发
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 微信小程序开发问题汇总
  • 我看到的前端
  • 一起参Ember.js讨论、问答社区。
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​学习一下,什么是预包装食品?​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (四)Linux Shell编程——输入输出重定向
  • (算法)Game
  • (一)Dubbo快速入门、介绍、使用
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)VirtualBox安装增强功能
  • (转载)Google Chrome调试JS
  • .NET建议使用的大小写命名原则
  • .NET性能优化(文摘)
  • ::before和::after 常见的用法
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2021 蓝帽杯] One Pointer PHP
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [C# 开发技巧]实现属于自己的截图工具
  • [HackMyVM]靶场 Wild
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [HUBUCTF 2022 新生赛]
  • [JavaWeb]—Spring入门