电话号码的字母组合

news2024/12/23 22:33:37

题目:17. 电话号码的字母组合 - 力扣(Leetcode)

思路:

给定一个电话号码字符串 digits,须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr,然后再用 Combine 函数递归地去尝试构造出每一个可能的字母组合。当已经处理完已知的所有数字时(即 di == digits.size()),就可以将当前已经组合好的字符序列 combineStr 加入到结果列表 retV 中。

具体递归过程的实现如下:首先获取当前要处理的数字编号 num,从映射表中取出该数字对应的所有字符 str,并遍历该字符集中的每一个字符 ch:将 ch 这个字符追加到当前的字符序列 combineStr 中,然后继续往下一层递归;在这个新的递归中,di 的值加一,以便能够继续处理下一个数字。直到我们处理完所有的数字并递归返回到最初的调用点结束整个递归过程为止。

注意上述递归过程中,临时字符串 combineStr 是通过每次添加新字符而累积的,因此需要在递归返回时进行回退,以保证下一轮试探可以得到正确的结果。

代码实现:

class Solution 
{
    //定义数字字符到字母表的映射表
    string numToStr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//或者:char* numToStr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
    void Combine(string digits, int di, vector<string>& retV, string combineStr) {
        //递归结束标志:已经处理完所有的数字,将当前字母串加入结果列表
        if(di == digits.size()) 
        {
            retV.push_back(combineStr);
            return;
        }

        //获取当前要处理的数字编号及其对应的字母串
        int num = digits[di] - '0';
        string str = numToStr[num];
        for(auto ch: str) 
        {
            //往下一层搜索找到新的字母字符并加入当前字母串
            Combine(digits, di+1, retV, combineStr+ch);
        } 
    }

    vector<string> letterCombinations(string digits) 
    {
        vector<string> v;
        //单独处理空字符串的情况
        if(digits.empty()) 
        {
            return v;
        }
        //递归生成所有可能的字母组合
        string str;
        Combine(digits, 0, v, str);

        return v;
    }
};

解释:

这段代码主要实现了一个递归回溯法,用于求解电话号码的字母组合问题。下面是它的详细解释:

  • 第1步:定义类Solution和一个私有函数Combine以及一个公有函数letterCombinations

  • 第2步:定义数字字符到字母表的映射表numToStr,其中第一个条目对应的是数字 0。这里使用字符串数组来存储映射字符。

  • 第3步:定义回溯函数Combine,它有4个参数:当前正在处理的电话号码(digits)、当前处理到的数字位置(di)、结果列表容器(retV)和已经处理好的字母组合串(combineStr)。

  • 第4步:在Combine中,当要处理的数字位置 di 达到了 digits 的长度时,即表明已经完成了一次字母组合的构造。此时将之前收集到的正确字母组合串追加到结果列表retV 中,并直接退出该递归过程。

  • 第5步:当递归搜索还未结束时,从当前数字位置开始(di 所指的位置),获取该位置上的数字编号 num,并找到对应的字母串 str。然后遍历该字符集中的每一个字符 ch,在 combineStr 后添加该字符,也就是生成了一个新的临时字母组合串,形如 combineStr+ch。

  • 第6步:新的临时字母组合串(即combineStr+ch)被传入到下一层搜索中,以便用于试探下一个数字所对应的所有可能字母。

  • 第7步:最终、递归地从 combineStr 开始往后连接新的字符,直到整个字符串构造完成。Combine 函数的返回值表示所有可能的字母组合串,以向上递归给调用函数传递答案。

  • 第8步:letterCombinations 外部函数中,为效率考虑先对空字符串进行特判;然后用 Combine 函数生成所有可能的字母组合排列,并返回结果容器 retV。

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

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

相关文章

【Linux专区】 环境搭建 | 带你白嫖七个月阿里云服务器

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《Linux专区》&#x1f448; 前言&#xff1a; 工欲善其事必先利其器&#xff0c;没个Linux环境怎么愉快地学Linux&#xff1f;这期就先带大家把环境搞好&#xf…

物联网系统中常见的通信协议分析

物联网&#xff08;Internet of Things, 简称IoT&#xff09;是指将各种传感器、设备等通过互联网连接起来&#xff0c;形成一个庞大的网络&#xff0c;实现物与物之间的互联互通。在实现这个过程中&#xff0c;各种不同的通信协议被广泛应用。本文将为大家介绍物联网中常见的通…

[架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

目录 一、文件的索引块。 二、索引分配表 三、索引表的链接方案 四、多层索引 五、混合索引分配 一、文件的索引块。 存放在目录中的文件&#xff0c;并非是文件的真实内容。 目录中记录了文件的索引块是几号磁盘块。 文件对应的索引表是存放在指定的磁盘块中的&#x…

CSI指纹预处理(中值、均值、Hampel、小波滤波)

目录 1、前言 2、中值滤波器 3、均值滤波器 4、Hampel滤波器 5、小波变换滤波器 1、前言 因为设备、温度和实验室物品摆设等因素的影响&#xff0c;未经处理的CSI数据不能直接使用&#xff0c;需要对数据进行异常值处理以保证数据的稳定性&#xff0c;同时减少环境中人的…

云原生Istio架构和组件介绍

目录 1 Istio 架构2 Istio组件介绍2.1 Pilot2.2 Mixer2.3 Citadel2.4 Galley2.5 Sidecar-injector2.6 Proxy(Envoy)2.7 Ingressgateway2.8 其他组件 1 Istio 架构 Istio的架构&#xff0c;分为控制平面和数据面平两部分。 - 数据平面&#xff1a;由一组智能代理&#xff08;[En…

Eclipse改SSH项目,修改java代码无效

遇到了一个大坑&#xff0c;记录一下… 坑1&#xff1a;修改后台代码总是没用… 1.背景&#xff1a; Eclipse运行SSH项目&#xff08;StrutsSpringHibernate&#xff09;&#xff0c;修改SQL语句&#xff0c;但是前端查询的结果没变化…(例如&#xff0c;在sql里加上 where …

LeetCode279之完全平方数(相关话题:动态规划,四平方和定理)

题目描述 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例 1: 输入:n = 12 输出:3 解释:12 = 4 + 4 +…

【Android构建篇】MakeFile语法

前言 对于一个看不懂Makefile构建文件规则的人来说&#xff0c;这个Makefile语法和shell语法是真不一样&#xff0c;但是又引用了部分shell语法&#xff0c;可以说是shell语法的子类&#xff0c;Makefile语法继承了它。 和shell语法不一样&#xff0c;这个更难一点&#xff0…

Vue3基本知识点

为什么要学vue3 1、Vue是国内 最火的前端框架 2、Vue3是2020年09月18日正式发布的 目前以支持Vue3的UI组件库 库名称简介ant-design-vuePC 端组件库&#xff1a;Ant Design 的 Vue 实现&#xff0c;开发和服务于企业级后台产品arco-design-vuePC 端组件库&#xff1a;字节跳…

DataX3同步Mysql数据库数据到Mysql数据库和DataX3同步mysql数据库数据到Starrocks数据库

DataX3同步Mysql数据库数据到Mysql数据库和DataX3同步mysql数据库数据到Starrocks 一、认识DataX二、DataX3概览三、DataX3框架设计四、DataX3插件体系五、DataX3核心架构六、DataX 3六大核心优势1.可靠的数据质量监控2.丰富的数据转换功能3.精准的速度控制4.强劲的同步性能5.健…

【AI面试】目标检测中one-stage、two-stage算法的内容和优缺点对比汇总

在深度学习领域中&#xff0c;图像分类&#xff0c;目标检测和目标分割是三个相对来说较为基础的任务了。再加上图像生成&#xff08;GAN&#xff0c;VAE&#xff0c;扩散模型&#xff09;&#xff0c;keypoints关键点检测等等&#xff0c;基本上涵盖了图像领域大部分场景了。 …

【解决办法】adobe photoshop :Assertion failed!

问题 PS启动时出现如下图错误&#xff08;实际行数可能不一样&#xff0c;program和file一样&#xff09;&#xff1a; ASSERTION FAILED Program…\node-vulcanjs\build\Release\VulcanMessagerLib.node File: C:\bid\workspace\CCX-Process\release…\vulcanadapter.cc Lin…

深度学习实战27-Pytorch框架+BERT实现中文文本的关系抽取

大家好,我是微学AI,今天给大家介绍一下深度学习实战27-Pytorch框架+BERT实现中文文本的关系抽取,关系抽取任务是一项重要的任务,其核心是从一段自然语言文本中抽取实体之间具有的关系。随着深度学习的发展,很多预训练模型在关系抽取任务上取得了显著的成果,其中BERT模型是…

Matlab实现多个窗口间的数据传递(不用GUIDE)

在用多个matlab的figure进行数据交互时&#xff0c;数据传入是较为简单的&#xff0c;可以直接用function的形参实现&#xff0c;但如何把数据传回&#xff0c;是个比较麻烦的问题。 在GUIDE下&#xff0c;系统自动生成了output_fcn函数&#xff0c;可以用它来实现从子窗口到主…

【P4】JMeter 原生录制方式——HTTP代理服务器

文章目录 一、准备工作二、原生录制方式——HTTP2.1、设计说明2.2、测试计划设计 三、原生录制方式——HTTPS3.1、设计说明3.2、测试计划设计 四、HTTP代理服务器主要参数说明4.1、目标控制器4.2、分组&#xff1a;在组间添加分割4.3、分组&#xff1a;每个组放入一个新的控制器…

2023年清华大学五道口金融学院招收公开招考博士研究生(普博)拟录取名单公示

公示期&#xff1a;十个工作日&#xff08; 2023年4月24日至5月9日 &#xff09; 经综合考核和研究生招生工作领导小组讨论&#xff0c;报学校研究生招生工作领导小组批准&#xff0c;清华大学五道口金融学院2023年公开招考博士研究生拟录取名单&#xff0c;现已确定&#xff…

Python 扩展教程(1): 调用百度AI

关于AI 自有计算机以来&#xff0c;人们就想让计算机具有人的感知、意识、概念、思维、行为&#xff0c;代替人的工作。AI (Artificial Interligence)是计算机科学的一个分支&#xff0c;专注研究、开发、模拟、扩展人的智能的理论、方法、技术及应用。 从研究领域和方法上&…

【Linux】6. 实现进度条和git基本认识和使用

编写小程序 – 进度条 1. 理解缓冲区概念 2. 理解\n 和 \r的区别 在操作系统层面&#xff1a;\n 表示换行 \r表示回车 在语言层面&#xff1a; \n就是回车换行 3. 进度条的需求分析 4. 代码编译 5. 代码优化 到这里进度条的编写也就完成了&#xff0c;✿✿ヽ(▽)ノ✿&#…

C语言基础应用(六)数组

引言 现程序要求&#xff0c;录入班里60名同学的所有成绩&#xff0c;我们应该怎么录入呢&#xff1f;按照我们之前所学习的难道要声明60个变量来录入成绩嘛&#xff1f; 就像&#xff1a; int main() {int a1,a2,a3,...,a60;scanf("%d%d%d...%d",&a1,&a2,…

anaconda使用教程

一.创建conda虚拟环境 conda create -n AI python3.8 conda create -n #代表创建conda虚拟环境 AI #创建的虚拟环境的名称 python3.8 #代表指定的Python版本 二.查看已创建的conda虚拟环境 conda env list三.激活conda虚拟环境 conda activate AI #AI 是co…