leetcode 17 电话号码的字母组合

news2024/11/25 1:04:01

题目描述:

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

        给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

思路:

从示例上来说,输入"23",最直接的想法就是两层for循环遍历,正好把组合的情况都输出了。

如果输入"233"呢,那么就三层for循环,如果"2333"呢,就四层for循环.......

理解本题后,要解决如下三个问题:

  • 数字和字母如何映射
  • 两个字母就两个for循环,三个字符就三个for循环,以此类推,然后发现代码根本写不出来
  • 输入1 * #按键等等异常情况

代码: 

class Solution {
    //先将数字对应字符串存入数组(直接定义成成员变量即可)
    string arr[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

public:
    //digists数字字符串的长度就是递归的深度,每个数字所对应的字符串str的长度代表递归的广度,i标志着当前层数即递归深度
    //combinStr是一种字母组合,retSV返回字符组合数组
    void _letterCombinations(string& digits, size_t i, string combinStr, vector<string>& retSV) 
    {
        //i等于数字字符串长度时,表示当前递归结束
        if (i == digits.size()) 
        { 
            //此时一种字母组合已经形成,将其插入返回数组中
            retSV.push_back(combinStr); 
            return;
        }
        //取出当前数字(当前层)对应的字符串"abc", "def", "jkl" 等
        string str = arr[digits[i] - '0'];  
   
       	//循环控制宽度,递归控制深度
        //j用于遍历所在层字符串的字符
        for (size_t j = 0; j < str.size(); ++j) 
        {
            //i控制递归遍历的深度,也就是层数
            _letterCombinations(digits, i + 1, combinStr + str[j], retSV);

            /* 
            combinStr+str[j] 将当前层遍历到的单个字母插入字符串,i+1 将递归深度+1进入下一层,即访问下一个数字的字符串
            combinStr不可使用+=,回溯到同一层时,combStr传值调用,combStr不可被改变,因为combStr还要和其他字母组合
            i也不可以使用++,因为递归之后要回溯到上一层,有循环存在,还要在进行下一路的递归,此时必须保证i还是这一层的i
            插一个字母进入下一层,直到最后一层结束再向上回溯,conbinStr也就插入了不同层字母,得到多个数字字母组合 
            */

        }
    }
    vector<string> letterCombinations(string digits) {
        string combinStr;    //组合字符串
        vector<string> retSV;    //收集字符组合的返回值数组
        if (digits.empty()) 
        {
            return retSV;
        }
        _letterCombinations(digits, 0, combinStr, retSV);   //调用递归子函数
        return retSV;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十七章:Dual Attention Network for Scene Segmentation ——双重注意力网络用于场景分割

0.摘要 在本文中&#xff0c;我们通过基于自注意机制捕捉丰富的上下文依赖来解决场景分割任务。与以往通过多尺度特征融合来捕捉上下文的方法不同&#xff0c;我们提出了一种双重注意力网络&#xff08;DANet&#xff09;&#xff0c;以自适应地将局部特征与全局依赖性相结合。…

.net6中WPF的串口通信和USB通信

之前写过串口通信&#xff0c;不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下&#xff0c;.net6中wpf的串口通信和USB通信&#xff0c;在工控行业中&#xff0c;这2种的方式非常多&#xff0c;还有网口通信&#xff0c;它们都是用来和…

TypeScript基础教程

ts与js区别 TypeScript is a syntactic sugar for JavaScript. TypeScript syntax is a superset of ECMAScript 2015 (ES2015) syntax. Every JavaScript program is also a TypeScript program. 语言层面&#xff1a;JavaScript和TypeScript都是ECMAScript&#xff08;ECMA-2…

【布局优化】基于遗传算法的车间布局优化 车间设施布局优化【Matlab代码#50】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 车间布局优化2. 基于GA的布局优化模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 车间布局优化 车间设施布置的规划一直是工业工程领域不断研究和探索的内容&am…

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论…

<数据结构>并查集

目录 并查集概念 合并 查找集合的数量 并查集类代码实现 并查集概念 并查集和堆一样&#xff0c;都是通过数组来实现树的节点映射&#xff0c;不过并查集作用是&#xff0c;把一堆数据分为不同的几个小集合 不过并查集是森林的概念&#xff0c;并查集的学习可以帮助我们去更…

(QGIS)在QGIS中加载星图地球数据云的数据

本文以“瓦片数据”为例进行操作示例说明&#xff0c;类似矢量数据、地形数据等&#xff0c;方法步骤一样&#xff0c;将URL换成对应数据的示例网址与本人的token即可。 1、星图地球数据云上注册用户 注册登录星图地球数据云网站&#xff1a;https://datacloud.geovisearth.c…

Python 函数(二)

Python 函数&#xff08;二&#xff09; 一、可变参数、不可变参数 ​ 什么是可变类型&#xff0c;什么又是不可变类型&#xff1f; 这里我们首先要了解一个东西&#xff0c;在计算机程序中我们定义一个变量&#xff0c;并对其存储一个数值。这里有两个关键概念&#xff1a;内…

数码管显示(静态与动态)

文章目录 一、数码管简介二、数码管连接方式2.1 共阴极2.2 共阳极2.3 数码管真值表 三、数码管驱动方式3.1 静态显示3.2 动态显示四、Cyclone IV数码管原理图 五、模块代码六、引脚分配七、动态显示八、引脚分配 一、数码管简介 数码管分七段数码管和八段数码管。七段和八段的…

为什么不推荐在头文件中直接定义函数?

1. 函数的分文件编写 在C中&#xff0c;函数的分文件编写是一种让代码结构更加清晰的方法&#xff0c;通常可以分为以下几个步骤&#xff1a; 创建后缀名为 .h 的头文件&#xff0c;在头文件中写函数的声明&#xff0c;以及可能用到的其他头文件或命名空间创建后缀名为 .cpp …

ES6迭代器、Set、Map集合和async异步函数

目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器&#xff08;Iterator&#xff09;就是这样一种机制。它是一种接口&#xff0c;为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

矩阵乘法的硬件加速

矩阵乘法的硬件加速 这里的硬件加速是指&#xff0c;如果依靠算法&#xff0c;可以通过减少访存次数来加速。可以将数据预取到cache来减少访存次数。 矩阵相乘最简单的实现 寄存器平铺矩阵乘法 将矩阵划分成多个小的矩阵块&#xff0c;小的矩阵块可以存放在寄存器中&#xff0…

QT开发技巧之嵌入式linux QT的QCombobox显示空白的问题

1.问题 开发平台&#xff1a;imx6ull qt版本&#xff1a;5.12.9 在嵌入式linux上运行的qt&#xff0c;QCombobox显示空白&#xff0c;不能显示其中的文本内容 2.解决办法 选中QCombobox&#xff0c;在属性栏中将foucsPolicy由WheelFocus改成NoFocus就好了

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态&#xff08;0&#xff1a;未删除 1&#xff1a;删除&#xff09; 角色权限关联表--role_permission id------…

【PHP面试题50】Redis的主从复制实现原理是怎么样的?如何保证数据一致性?数据延迟又该如何处理?

文章目录 一、前言二、主从复制的基本原理三、数据一致性的保证四、数据延迟的处理四、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 R…

OpenCv算子

目录 一、索贝尔(sobel)算子 二、沙尔(Scharr)算子 三、拉普拉斯算子 一、索贝尔(sobel)算子 边缘的定义: 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取、对象检测、模式识别等方面都有重要的作用。 sobel算子对图像求一阶导数。…

【V8】【1. 内存布局、隐藏类Hidden Class】

JavaScript 中的对象是由一组组属性和值的集合。JavaScript 对象像一个字典&#xff0c;字符串作为键名&#xff0c;任意对象可以作为键值&#xff0c;可以通过键名读写键值。 在 ECMAScript 规范中定义了数字属性应该按照索引值大小升序排列&#xff0c;字符串属性根据创建时…

python将dataframe数据导入MongoDB非关系型数据库

文章目录 pymongo连接新建数据库和集合pandas导入数据插入数据数据查看 pymongo连接 import pymongo client pymongo.MongoClient("mongodb://localhost:27017/") dblist client.list_database_names() for db in dblist:print(db) #查看已有数据库admin bilibil…

apply()函数--Pandas

1. DataFrame.apply()函数 1.1 函数功能 对DataFrame沿着指定轴运用函数。 函数接收到的对象是Series对象&#xff0c;它们的索引可以是DataFrame的行索引&#xff08;axis0&#xff09;或列索引&#xff08;axis1&#xff09;。结果为Series或DataFrame。 1.2 函数语法 Da…