力扣第17题 电话号码的字母组合 c++ 回溯 经典提升题

news2025/2/25 5:39:06

题目

17. 电话号码的字母组合

中等

相关标签

哈希表   字符串   回溯

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

思路和解题方法

  1. 代码首先定义了一个常量数组 letterMap,其中每个元素表示数字0-9对应的字符集合。这样,我们可以通过数字来索引 letterMap 中的元素,得到对应的字符集合。
  2. 接下来,代码定义了两个成员变量 anss,分别用于存储最终的答案集合和临时的组合结果。
  3. 然后,代码定义了一个递归函数 backtracking,该函数通过参数 digitsindex 来表示当前处理的数字串和目前处理到的位置。
  4. backtracking 函数中,当 index 等于 digits 的大小时,说明已经找到了一种组合,将 s 加入到答案集合 ans 中,并返回。
  5. 否则,获取当前位置的数字 digit,以及它对应的字符集合 letters
  6. 接下来,通过循环遍历当前数字对应的每个字符,并将其依次加入到临时组合结果字符串 s 中。
  7. 然后,递归调用 backtracking 函数处理下一个数字的字母组合。
  8. 最后,在完成递归调用后,进行回溯操作,将刚才加入的字符移出,继续尝试下一个字符。
  9. 在主函数 letterCombinations 中,首先清空临时字符串 s 和答案集合 ans
  10. 然后,判断输入的数字串是否为空,如果为空,直接返回空的答案集合。
  11. 否则,调用 backtracking 函数开始搜索字母组合。
  12. 最后,返回最终的答案集合。

复杂度

        时间复杂度:

                O(3m×4n)

算法的时间复杂度为 O(3m×4n),其中 m 表示输入数字串中对应字母集合大小为 3 的数字个数,n 表示输入数字串中对应字母集合大小为 4 的数字个数。因为一般情况下一个数字对应 3 个字母,另外两个数字对应 4 个字母,所以总的时间复杂度为 O(3m×4n)。

        空间复杂度

                O(m+n)

空间复杂度为 O(m+n),即递归栈的深度。在最坏情况下,所有数字都对应字母集合大小为 4,所以根据上面的时间复杂度分析,有 m+n 个数字需要进行搜索,因此栈的深度也为 m+n,所以空间复杂度为 O(m+n)。

c++ 代码

class Solution {
public:
    const string letterMap[10]={
        "",       // 数字0对应的字母为空字符串,因为通常没有字母对应数字0
        "",       // 数字1对应的字母为空字符串,因为通常没有字母对应数字1
        "abc",    // 数字2对应的字母为abc
        "def",    // 数字3对应的字母为def
        "ghi",    // 数字4对应的字母为ghi
        "jkl",    // 数字5对应的字母为jkl
        "mno",    // 数字6对应的字母为mno
        "pqrs",   // 数字7对应的字母为pqrs
        "tuv",    // 数字8对应的字母为tuv
        "wxyz"    // 数字9对应的字母为wxyz
    };

    vector<string> ans;  // 存储最终的答案集合
    string s;            // 用于临时存储每个组合结果的字符串

    void backtracking(string &digits,int index)
    {
        if(index == digits.size())  // 如果达到了数字串的末尾,说明已经找到了一种组合,将其加入到答案集合中
        {
            ans.push_back(s);
            return ;
        }

        int digit = digits[index] - '0';  // 获取当前位置的数字
        string letters = letterMap[digit];  // 获取当前数字对应的字母集合
        for(int i=0;i<letters.size();i++)  // 遍历当前数字对应的每个字母
        {
            s.push_back(letters[i]);  // 将字母加入到临时组合结果字符串中
            backtracking(digits,index +1);  // 继续递归下一个数字的字母组合
            s.pop_back();  // 回溯,将刚才加入的字母去除,尝试下一个字母
        }
    }

    vector<string> letterCombinations(string digits) {
        s.clear();   // 清空临时字符串s
        ans.clear();  // 清空答案集合ans
        if(digits.size() == 0)  // 如果输入的数字串为空,则直接返回空的答案集合
        {
            return ans;
        }
        backtracking(digits,0);  // 开始回溯搜索字母组合
        return ans;  // 返回最终的答案集合
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

Elasticsearch系列组件:Logstash强大的日志管理和数据分析工具

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

sqlserver系统存储过程添加用户学习

sqlserver有一个系统存储过程sp_adduser&#xff1b;从名字看是添加用户的&#xff1b;操作一下&#xff0c; 从错误提示看还需要先添加一个登录名&#xff0c;再执行一个系统过程sp_addlogin看一下&#xff0c; 执行完之后看一下&#xff0c;安全性-登录名下面有了rabbit&…

【ARM Coresight Debug 系列 -- Linux 断点 BRK 中断使用详细介绍】

文章目录 1.1 ARM BRK 指令1.2 BRK 立即数宏定义介绍1.3 断点异常处理流程1.3.1 el1_sync_handler1.3.2 el1_dbg 跟踪 1.4 debug 异常处理函数注册1.4.1 brk 处理函数的注册 1.1 ARM BRK 指令 ARMv8 架构的 BRK 指令是用于生成一个软件断点的。当处理器执行到 BRK 指令时&…

电脑办公助手之桌面便签,助力高效率办公

在现代办公的快节奏中&#xff0c;大家有应接不暇的工作&#xff0c;每天面对着复杂的工作任务&#xff0c;总感觉时间不够用&#xff0c;而且工作无厘头。对于这种状态&#xff0c;大家可以选择在电脑上安装一款好用的办公便签软件来辅助日常办公。 敬业签是一款专为办公人士…

android--屏幕适配

基础概念 像素密度 dpi &#xff08; √宽^2高^2 &#xff09; / 屏幕大小 手机分辨率 1080 * 1920 1080代表宽 1920代表高 单位为px像素 屏幕大小为英寸 标准的像素密度 mdpi 160dpi dp 密度无关像素 dp与px的转换 density (dpi / 16…

python 之enumerate()函数

文章目录 enumerate() 是 Python 中的一个内置函数&#xff0c;它用于在遍历可迭代对象&#xff08;如列表、元组、字符串等&#xff09;时同时获取每个元素的索引和值。这个函数非常有用&#xff0c;因为它允许您在迭代过程中轻松地访问元素的索引&#xff0c;而不需要手动维护…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前讲到了流程保存的时候还要看是否是自定义业务流程应用类型&#xff0c;若是保存的时候不再检查是否有关…

常见三维建模软件有哪些?各自的特点是什么?

常见的三维建模软件包括以下这些&#xff1a; 1. 3DS Max 3D Studio Max&#xff0c;简称3DS MAX&#xff0c;是当今世界上销售量最大的三维建模、动画及渲染软件。它的应用范围广泛&#xff0c;包括计算机游戏中的动画制作、影视片的特效制作等。3DS MAX的操作相对容易&#…

幸运的袋子(递归+回溯)

目录 一、题目 二、代码 一、题目 幸运的袋子__牛客网 二、代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;static int _count 0; static int sum 0; static int product 1;void Combination(vector<int>…

JAVA学习(6)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【Proteus仿真】【51单片机】电蒸锅温度控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602液晶、按键开关、蜂鸣器、DS18B20温度传感器&#xff0c;液位传感器、继电器控制加热保温装置等。 主要功能&#xff1a; 系统运行后&#…

Elasticsearch7.9.3保姆级安装教程

Linux版本Elasticsearch版本(待安装)Kibana版本(待安装)CentOS 77.9.37.9.3 一、下载地址 1、官网下载 打开地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff0c;按如图所示选择对应版本即可 2、采用wget下载 为了不必要的麻烦&#xff0c;建…

nginx.3——local的优先级和匹配方式

在http模块有server模块,在server模块才有location模块, location匹配的是uri location 匹配一旦成功&#xff0c;就不向下匹配 一、location的分类&#xff1a; 1.精确匹配 location /test 2.正则匹配 location ^~ :前缀匹配&#xff0c;以什么为开头 location ~ 区…

【RocketMQ系列四】消息示例-简单消息的实现

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

十五届蓝桥选拔赛Scratch-2023.08.20STEMA测评试题解析

2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组 T2 飞驰的高铁 具体要求: 1). 点击绿旗,角色、背景如图所示; 2). 按下一次数字1按键之后,画面中的景色持续向左侧水平移动(参照程序演示视频); 3). 按下一次数字2按键之后,程序结束。 评判标准: 5分:…

“岗课赛证”融通的物联网综合实训室建设方案

一、概述 随着5G技术的普及应用和产业经济的革新发展,物联网产业所呈现的广阔前景带来了对创新型技术技能人才的迫切需求。高职院校物联网专业建设也因此转变为面向国家战略性新兴产业发展需求。当前,“岗位课程竞赛证书”融通的培育理念,是高职院校物联网人才培养和专业优化的…

2023年中国商业版服务器操作系统市场发展规模分析:未来将保持稳定增长[图]

服务器操作系统一般指的是安装在大型计算机上的操作系统&#xff0c;比如Web服务器、应用服务器和数据库服务器等&#xff0c;是企业IT系统的基础架构平台&#xff0c;也是按应用领域划分的三类操作系统之一。同时服务器操作系统也可以安装在个人电脑上。 服务器操作系统分类 …

OpenAI将发布DALL·E3,多模态输出模式引爆热点

OpenAI在官网宣布&#xff0c;在今年10月份将通过API向ChatGPT Plus和企业版用户提供全新文本生成图片产品——DALLE 3。 OpenAI在去年 4 月推出了DALL・E 2 &#xff0c;时隔一年DALLE 3即将上线&#xff0c;OpenAI 表示&#xff0c;「DALL・E 3 比以往系统更能理解细微差别和…

17 - 并发容器的使用:识别不同场景下最优容器

在并发编程中&#xff0c;我们经常会用到容器。今天我要和你分享的话题就是&#xff1a;在不同场景下我们该如何选择最优容器。 1、并发场景下的 Map 容器 假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下&#xff0c;我们是用一个哈希表…

每天五分钟机器学习:如何解决欠拟合问题

本文重点 欠拟合是机器学习中常见的问题之一,指的是模型无法很好地拟合训练数据,导致预测结果的误差较大。欠拟合问题一般是由于模型过于简单或者训练数据过少导致的。下面将详细介绍如何解决欠拟合问题。 增加模型复杂度 1. 增加模型的层数:对于神经网络模型,可以增加隐…