【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.mzph.cn/news/837757.shtml

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

相关文章

Web开发三层架构

##Controller Service Dao(mapper) 软件设计&#xff1a;高内聚 低耦合 Controller 调用Service&#xff0c; Service调用 DAO 模块之间耦合 如果要从EmpServiceA切换到EmpServiceB&#xff0c;Controller代码也要修改 new EmpServiceB 分层接耦 容器中放EmpServiceA&am…

文本批量高效管理,一键删除前后第一行,轻松提升工作效率!

在信息爆炸的时代&#xff0c;文本处理成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;面对大量的文本数据&#xff0c;如何高效地进行批量管理&#xff0c;成为了许多人头疼的问题。今天&#xff0c;我们将向您介绍一种简单而高效的方法&#xff0c;让您轻松删除…

【UE5.1 角色练习】01-使用小白人蓝图控制商城角色移动

目录 效果 步骤 一、导入资源 二、控制角色移动 三、更换角色移动动作 效果 步骤 一、导入资源 新建一个工程&#xff0c;然后在虚幻商城中将角色动画的相关资源加入工程&#xff0c;这里使用的是“动画初学者内容包”和“MCO Mocap Basics” 将我们要控制的角色添加进…

搜索引擎的设计与实现(四)

目录 6 系统测试 6.1测试重要性 6.2测试用例 结 论 参 考 文 献 前面内容请移步 搜索引擎的设计与实现&#xff08;三&#xff09; 免费源代码&毕业设计论文 搜索引擎的设计与实现 6 系统测试 6.1测试重要性 该项目是在本地服务器上进行运行和调试&#xff0c;…

【从零开始学习Redis | 第十一篇】快速介绍Redis持久化策略

前言&#xff1a; Redis 作为一种快速、高效的内存数据库&#xff0c;被广泛应用于缓存、消息队列、会话存储等场景。然而&#xff0c;由于其特性是基于内存的&#xff0c;一旦服务器进程退出&#xff0c;内存中的数据就会丢失。为了解决这一问题&#xff0c;Redis 提供了持久…

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维&#xff0c;提高工作效率。 2、我用代码批判思维&#xff0c;逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员&#xff0c;是哪些重要的专业习惯&#xff0c;让我如此优秀&#xff1f; 2、可以免费获取到的IT资源 1、《软件工程&a…

【嵌入式模块芯片开发】ADXL345的优化精确测量和角度计算(中断单次测量、卡尔曼滤波)

【嵌入式模块芯片开发】ADXL345的优化精确测量和角度计算&#xff08;中断单次测量、卡尔曼滤波&#xff09; 文章目录 ADXL345的一般读取方式ADXL345的中断读取方式&#xff08;单次测量&#xff09;角度计算卡尔曼滤波优化后完整代码附录&#xff1a;压缩字符串、大小端格式…

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”&#xff0c;这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。小编将…

手撸XXL-JOB(三)——本地定时任务管理平台

引言 在XXL-JOB中&#xff0c;有一个xxl-job-admin项目&#xff0c;这个就相当于定时任务的调度平台&#xff0c;我们参考XXL-JOB&#xff0c;也添加这么一个调度平台&#xff0c;由于篇幅有限&#xff0c;我们先实现一个本地的定时任务调度平台&#xff0c;至于如何调用远程的…

算法练习day8

反转字符串 代码随想录 0344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.05小时&#xff09; 思路 这道题很简单也很经典。 字符串的反转方法有很多&#xff0c;我这里是用for循环通过数组长度和下标计算来交换。…

【小积累】@Qualifier注解

今天在看rabbitMQ的时候需要绑定交换机和队列&#xff0c;交换机和队列都已经注入到spring容器中&#xff0c;写了一个配置类&#xff0c;使用了bean注解注入的。所以这时候绑定的时候需要使用容器中的交换机和队列&#xff0c;必须要使用Qualifier去确定是容器中的哪个bean对象…

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程&#xff0c;可以理解为将屏幕上的一个像素&#xff08;下文用像素表示&#xff09;映射到纹理上的一个像素&#xff08;下文用纹素表示&#xff09;&#xff0c;然后用纹理上的这个像素的颜色进行显示。 理想情况下&#xff0c;屏幕…

Optional用法

说明&#xff1a;Optional和Stream一样&#xff0c;是Java8引入的特性&#xff0c;本文介绍Optional的几个实际用法。Steam流使用&#xff0c;参考下面这篇文章&#xff1a; Stream流使用 使用 1.保证值存在 // 1.保证值存在&#xff0c;pageNumber&#xff0c;pageSizeInte…

HTTP基础概念和HTTP缓存技术

什么是HTTP HTTP是超文本传输协议&#xff0c;主要分为三个部分&#xff1a;超文本、传输、协议。 超文本是指&#xff1a;文字、图片、视频的混合体。传输是指&#xff1a;点与点之间的信息通信。协议是指&#xff1a;通信时的行为规范或约定 HTTP常见字段 字段名 解释 例…

图片标签 以及 常见的图片的格式

1.图片的基本使用 2.图片的常见格式 3.bmp格式

前端已死? Bootstrap--JS-jQuery

目录 Bootstrap--JS-jQuery 1 jQuery基础 介绍 基础语法&#xff1a; $(selector).action() 1.1 安装jQuery 地址 基础语法&#xff1a; $(selector).action() 2 jQuery事件 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法。 jQuery常用事件 2.1 鼠标事件…

element-ui的表单中,输入框、级联选择器的长度设置

使用<el-col>控制输入框的长度 <el-form-item label"姓名" label-width"80px"><el-col :span"15"><el-input v-model"form.name" autocomplete"off"></el-input></el-col></el-form…

AI助力内容创作:让效率与质量齐飞

简述&#xff1a; 本文介绍了AI如何帮助创作者在保持内容质量的同时&#xff0c;大幅度提升生产效率的一些方法&#xff0c;希想 对大家有帮助。 一、自动化内容生成 1. 文本内容生成 使用GPT等模型&#xff1a;利用如GPT-3或GPT-4等大型语言模型&#xff0c;可以直接输入关…

[译文] 恶意代码分析:2.LNK文件伪装成证书传播RokRAT恶意软件(含无文件攻击)

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

Github项目管理——仓库概述(一)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…