【C++】每日一题 17 电话号码的字母组合

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

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

在这里插入图片描述
可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来,然后使用回溯算法来生成所有可能的组合。

回溯算法是一种通过不断尝试各种可能性来解决问题的方法,通常用于求解组合、排列、子集等问题。它通过深度优先搜索的方式探索问题的所有解空间,并在搜索过程中进行剪枝,从而有效地找到满足特定条件的解。

下面是回溯算法的一般步骤:

选择路径: 从问题的初始状态出发,按照某种规则选择一个候选解的路径,即在问题的解空间中前进一步。

探索路径: 在当前选择的路径上继续向前探索,查找可能的解或部分解。

约束条件: 在探索过程中,判断当前路径是否满足问题的约束条件。如果不满足,则放弃该路径,回退到上一步,继续探索其他路径。

标记状态: 在进入下一层递归之前,通常需要修改问题的状态,以便记录当前路径的选择或处理过程。

回退路径: 当探索到底或者无法继续前进时,需要回退到上一层,撤销当前路径的选择,返回上一层继续探索其他路径。

结束条件: 当搜索到达问题的解空间的边界或者满足特定条件时,结束搜索,得到最终的解或者部分解。

回溯算法的核心思想是通过不断地选择、探索、回退和标记状态,逐步地搜索问题的解空间,直到找到所有满足条件的解或者确定无解。

#include <iostream>
#include <vector>
#include <string>using namespace std;// 定义数字与字母的映射关系
vector<string> keypad = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};// 回溯算法生成所有可能的组合
void backtrack(vector<string>& result, string& digits, string current, int index) {// 如果当前组合的长度等于输入数字的长度,则将当前组合加入结果集if (index == digits.length()) {result.push_back(current);return;}// 获取当前数字对应的字母集合string letters = keypad[digits[index] - '0'];// 遍历当前数字对应的每一个字母,进行回溯for (char letter : letters) {current.push_back(letter); // 添加当前字母到当前组合中backtrack(result, digits, current, index + 1); // 递归处理下一个数字current.pop_back(); // 回溯,撤销当前字母}
}vector<string> letterCombinations(string digits) {vector<string> result;if (digits.empty()) return result; // 如果输入为空,则直接返回空结果集string current = "";backtrack(result, digits, current, 0); // 调用回溯算法生成所有可能的组合return result;
}int main() {string digits = "23";vector<string> combinations = letterCombinations(digits);cout << "所有可能的字母组合:" << endl;for (const string& combination : combinations) {cout << combination << " ";}cout << endl;return 0;
}

时间空间复杂度分析

假设输入数字串的长度为 ( n ),每个数字对应的字母集合的平均长度为 ( m )。

时间复杂度分析:
回溯算法:
对于每个数字,我们都需要尝试其对应的所有字母,这需要 ( O(m) ) 的时间。
由于有 ( n ) 个数字,因此总共的时间复杂度为 ( O(m^n) )。
结果集合生成:
生成结果集合的过程中,需要将所有可能的组合添加到结果集中,这也需要 ( O(m^n) ) 的时间。
综合起来,整个算法的时间复杂度为 ( O(m^n) )。

空间复杂度分析:
递归调用栈:
递归调用栈的深度最多为输入数字串的长度 ( n ),因此需要额外的 ( O(n) ) 的空间。
结果集合:
存储结果集合所需的空间取决于结果的数量。最坏情况下,结果数量为 ( O(m^n) ),因此需要 ( O(m^n) ) 的空间。
综合起来,整个算法的空间复杂度为 ( O(m^n) )。

总的来说,这个算法的时间和空间复杂度都是指数级别的,随着输入规模 ( n ) 和每个数字对应的字母集合的大小 ( m ) 的增加,其运行时间和所需空间将急剧增加。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模——线性回归模型

目录 1.线性回归模型的具体步骤和要点&#xff1a; 1.收集数据&#xff1a; 2.探索性数据分析&#xff1a; 3.选择模型&#xff1a; 4.拟合模型&#xff1a; 5.评估模型&#xff1a; 1.R平方&#xff08;R-squared&#xff09;&#xff1a; 2.调整R平方&#xff08;Ad…

2024CCPC全国邀请赛(郑州)暨河南省赛

2024CCPC全国邀请赛&#xff08;郑州站&#xff09;暨河南省赛 一铜一银&#xff0c;虽不是线下第一次参赛但是第一次拿xcpc奖牌&#xff0c;还有个国赛奖真是不戳。感谢学长&#xff0c;感谢队友&#xff01; 虽然遗憾没有冲到省赛金&#xff0c;不过还有icpc商丘&#xff08…

Golang RPC实现-day01

导航 Golang RPC实现一、主体逻辑设计二、服务设计1、监听和接收请求2、处理请求(1)服务结构体定义(2)确认请求方和服务方编解码格式(3)循环读取请求(4)解析请求的内容(5)响应请求 三、读取和发送数据到连接中代码 Golang RPC实现 先来一个最简单的版本&#xff0c;后续更新。…

蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app

本文来自&#xff1a;蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app - 源码1688 卡券绿色循环计划—— 一项旨在构建卡券价值再利用生态的社会责任感项目。在当前数字化消费日益普及的背景下&#xff0c;大量礼品卡、优惠券因各种原因未能有效…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 大家继续看 https://lilianweng.github.io/posts/2023-06-23-agent/的文档内容 第二部分&#xff1a;内存 记忆的类型 记忆可以定义为用于获取、存储、保留以及随后检索信息的过程。人脑中有多…

PLL-分频器

概念 分频器的性能一般用四个参数来规定:(1)分频比&#xff0c;(2)最大允许输入频率fmax&#xff0c;(3)功耗&#xff0c;(4)最小允许输入电压摆幅(也叫“灵敏度”)。虽然分频器的相位噪声也很重要&#xff0c;但在大多数情况下它可以忽略不计。 把一般分频器的输入灵敏度画成…

HTML常用标签-表单标签

表单标签 1 表单标签2 表单项标签2.1 单行文本框2.2 密码框2.3 单选框2.4 复选框2.5 下拉框2.6 按钮2.7 隐藏域2.8 多行文本框2.9 文件标签 1 表单标签 表单标签,可以实现让用户在界面上输入各种信息并提交的一种标签. 是向服务端发送数据主要的方式之一 form标签,表单标签,其内…

2024年小学生古诗文大会备考:吃透历年真题和知识点(持续)

根据往年的安排&#xff0c;2024年小学生古诗文大会预计这个月就将启动。该如何备考2024年小学生古诗文大会呢&#xff1f;根据往期的经验&#xff0c;只要吃透这些真题和背后的知识点&#xff0c;通过上海小学生古诗文大会的初选&#xff08;初赛&#xff09;一点问题都没有。…

中国196个城市边界

中国196个城市的城市边界形状文件是通过对Li等人&#xff08;2018&#xff09;的输出进行处理和过滤生成的。根据全球人工不可渗透区域 &#xff08;GAIA&#xff09; 数据绘制全球城市边界。 城市建成区边界是城市研究中的一个重要指标&#xff0c;在很多城市研究中都会涉及到…

优先级队列(堆)

目录 leetcode题目 一、数组中两元素的最大乘积 二、最后一块石头的重量 三、数据流中的第 K 大元素 四、前K个高频元素 五、前K个高频单词 六、数据流的中位数 七、有序矩阵中的第K小的元素 八、根据字符出现频率排序 leetcode题目 一、数组中两元素的最大乘积 146…

20【Aseprite 作图】画岩石

1 画一个岩石的框架,不是一个正规的圆,可以把最高点不放在中心,会显得自然 2 用油漆桶填满框架 3 要改变岩石的颜色,可以调整HSV里面的S,降低饱和度 4 描边,和地面连接处可以不描边 5 颜色调得更浅一点,(通过HSV里面的S可以做到),作为亮处的轮廓; 通过把透明度调…

探索智慧生活:百度Comate引领人工智能助手新潮流

文章目录 百度Comate介绍1. 什么是百度Comate&#xff1f;主要特点 2. Comate的核心功能智能问答功能语音识别功能语音助手功能个性化服务 3. Comate 支持哪些语言&#xff1f; 使用教程(以vscode为例)1. 下载和安装Comate3. 常用操作快捷键(windows) 使用体验自然语言生成代码…

【联通支付注册/登录安全分析报告】

联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

未授权访问:ZooKeeper 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章&#xff1a; 这里附上大…

多格式兼容的在线原型查看:Axure RP的便捷解决方案

Axure rp不仅可以绘制详细的产品构思&#xff0c;还可以在浏览器中生成html页面&#xff0c;但需要安装插件才能打开。安装Axure后 rpchrome插件后&#xff0c;还需要在扩展程序中选择“允许访问文件网站”&#xff0c;否则无法在Axure中成功选择 rp在线查看原型。听起来很麻烦…

讲解SSM的xml文件

概述&#xff1a;这些配置文件很烦&#xff0c;建议直接复制粘贴 springMVC.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

51 单片机[2-2]:LED闪烁

摘要&#xff1a; 本文使用STC89C52RC单片机实现单个LED闪烁 新建一个项目&#xff0c;具体步骤见[2-1] 分析&#xff1a; 要使 LED 闪烁&#xff08;以D1为例&#xff09;&#xff0c;就要先让 P2 0xfe; 再让 P2 0xff; 先在keil5中把程序写成这样&#xff1a; #include &…

Spring Boot:异常处理

Spring Boot 前言使用自定义错误页面处理异常使用 ExceptionHandler 注解处理异常使用 ControllerAdvice 注解处理异常使用配置类处理异常使用自定义类处理异常 前言 在 Spring Boot 中&#xff0c;异常处理是一个重要的部分&#xff0c;可以允许开发者优雅地处理应用程序中可…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…