192.回溯算法:电话号码的字母组合(力扣)

代码解决

class Solution {
public:
    // 定义每个数字对应的字母映射
    const string letterMap[10] = {
        "",     // 0
        "",     // 1
        "abc",  // 2
        "def",  // 3
        "ghi",  // 4
        "jkl",  // 5
        "mno",  // 6
        "pqrs", // 7
        "tuv",  // 8
        "wxyz"  // 9
    };

    string s;  // 用于存储当前的组合
    vector<string> result;  // 用于存储所有的组合结果

    // 回溯函数
    void backtracing(string digits, int index) {
        // 如果索引等于输入字符串的长度,说明生成了一个完整的组合
        if (index == digits.size()) {
            result.push_back(s);  // 将当前组合添加到结果集中
            return;
        }

        // 获取当前数字对应的字母字符串
        int dig = digits[index] - '0';  // 将字符转换为整数
        string letter = letterMap[dig];  // 获取对应的字母字符串

        // 遍历每个字母,进行回溯
        for (int i = 0; i < letter.size(); i++) {
            s.push_back(letter[i]);  // 将当前字母添加到组合中
            backtracing(digits, index + 1);  // 递归调用,生成下一层的组合
            s.pop_back();  // 回溯,移除最后一个添加的字母
        }
    }

    // 主函数
    vector<string> letterCombinations(string digits) {
        // 如果输入字符串为空,直接返回空结果
        if (digits.size() == 0) {
            return result;
        }

        // 调用回溯函数,从第0个字符开始
        backtracing(digits, 0);
        return result;
    }
};
成员变量
  • const string letterMap[10]:一个字符串数组,用于存储每个数字(0-9)对应的字母映射。
  • string s:一个字符串,用于存储当前生成的字母组合。
  • vector<string> result:一个字符串向量,用于存储所有生成的字母组合。
回溯函数:void backtracing(string digits, int index)
  • 参数:

    • string digits:输入的电话号码字符串。
    • int index:当前处理的字符索引。
  • 逻辑:

    • 结束条件: if (index == digits.size())
      • 如果当前索引等于输入字符串的长度,说明生成了一个完整的组合,将其添加到结果集中。
    • 获取当前数字对应的字母字符串
      • int dig = digits[index] - '0':将字符转换为整数。
      • string letter = letterMap[dig]:获取当前数字对应的字母字符串。
    • 遍历每个字母,进行回溯
      • for (int i = 0; i < letter.size(); i++):遍历当前字母字符串的每个字母。
      • s.push_back(letter[i]):将当前字母添加到组合中。
      • backtracing(digits, index + 1):递归调用,处理下一个字符。
      • s.pop_back():回溯,移除最后一个添加的字母,以便尝试其他字母。
主函数:vector<string> letterCombinations(string digits)
  • 逻辑:
    • 如果输入字符串为空,直接返回空的结果向量。
    • 调用回溯函数,从第0个字符开始生成组合。
    • 返回结果向量。

运行逻辑

  1. 从输入字符串的第一个字符开始,根据其对应的字母映射,依次尝试所有可能的字母。
  2. 对每个字母,递归处理下一个字符,直到生成一个完整的组合。
  3. 每生成一个完整的组合,就将其添加到结果向量中。
  4. 回溯,尝试其他可能的字母组合。

这个回溯算法的时间复杂度是 O(3^n * 4^m),其中 n 是对应 3 个字母的数字(如 2、3、4、5、6、8)的个数,m 是对应 4 个字母的数字(如 7、9)的个数。这个复杂度源于每个数字对应的字母数量及其组合的所有可能性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试----用例篇(设计测试用例保姆级教程✅)

文章目录 前言一、测试用例概念 二、如何设计测试用例三、设计测试用例的方法3.1基于需求的设计方法3.2具体的设计方法等价类边界值正交法判定表法场景法错误猜测法 前言 在软件开发过程中&#xff0c;测试用例是至关重要的一环。它们帮助软件开发人员和测试人员确定软件是否按…

FlinkSQL开发经验分享

最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用Flink的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对Flink原理与机制的理解&#xff0c;因此将…

嵌入式开发板屏幕显示汉字

一、实验目的 1&#xff0e;编写能够在嵌入式开发板LCD上显示汉字的程序&#xff1b; 2&#xff0e;在Ubuntu系统中编译上述程序生成可执行文件&#xff1b; 3&#xff0e;到开发板中验证。 二、实验步骤 1. Ubuntu系统上编写验证程序 Ubuntu系统上编写的验证程序如下&…

【开发12年码农教你】Android端简单易用的SPI框架-——-SPA

Service(priority 1) public class APrinterService implements IPrinterService { Override public void print() { System.out.println(“this is a printer service.”); } } 复制代码 B模块 —— BPrinterService Service(path“b_printer”, priority 2) public class…

监控 Promethus的监控告警Alertmanager、Grafana

Promethus的监控告警Alertmanager Alertmanager 介绍 Prometheus的一个组件&#xff0c;用于定义和发送告警通知&#xff0c;内置多种第三方告警通知方式&#xff0c;同时还提供了对Webhook通知的支持基于警报规则对规则产生的警报进行分组、抑制和路由&#xff0c;并把告警发…

华硕笔记本重装系统详细操作,图文教程体验Win11如何重装系统

随着科技的不断发展&#xff0c;电脑操作系统的步骤也在不断更新迭代。对于华硕笔记本用户来说&#xff0c;升级到Windows 11操作系统可以带来更好的使用体验。本文将通过图文教程的形式&#xff0c;详细介绍华硕笔记本重装Windows 11系统的操作步骤&#xff0c;帮助用户顺利完…

用AI打败AI,利用ai指令对头条文章进行查重测试,结果出乎意料

前言&#xff1a;现在的ai真的太火爆了&#xff0c;让人不得不感叹ai的神奇之处&#xff0c;让我们一起来探讨下ai的强大之处吧&#xff01;本文仅限学习研究。 背景&#xff1a;最近看到很多人用ai写文章&#xff0c;然后被头条判定为疑似ai生成&#xff0c;所以想研究学习下…

ES6 解构赋值详解

ES6是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性和语法改进&#xff0c;其中解构赋值是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值&#xff0c;并赋给对应的变量&#xff0c;让代码变得更加简洁和易读。本文将深入探讨ES6解构赋值的语法…

ROS | 常见故障排查

1.开启后发出一个WIFI WIFI名字&#xff1a;WHEELTEC接数字 安全密钥&#xff1a;dongguan 2.显示屏接口 USB接口接键鼠 3.远程登录命令 ssh -Y wheeltec192.168.0.100 是小车发出的WIFI的一个IP地址 4. 登录后确保IP地址 ip a 看一下 当前ip地址 倒数第四行-当前ip地址 1…

简易部署的设备日志采集工具

永久免费: Gitee下载 最新版本 使用说明: Moretl 企业级采集文件工具 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

数据结构---二叉树前中后序遍历

1. 某完全二叉树按层次输出&#xff08;同一层从左到右&#xff09;的序列为 ABCDEFGH 。该完全二叉树的前序序列为() A: ABDHECFG B: ABCDEFGH C: HDBEAFCG D: HDEBFGCA 2. 二叉树的先序遍历和中序遍历如下&#xff1a;先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则二叉…

[数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;152 标注数量(xml文件个数)&#xff1a;152 标注数量(txt文件个数)&#xff1a;152 标注类别…

企业级Web项目中应该如何做单元测试、集成测试和功能测试?

先自我介绍下&#xff1a; 本人有过10年测试经验&#xff0c;也参与过公安部网络安全产品测试交付、华为4G 网络设备测试交付、腾讯QQ空间APP产品测试交付。 关于“企业级Web项目中应该如何做单元测试、集成测试和功能测试”这个问题&#xff0c;我想给大家唠唠&#xff0c;我…

Django数据驾驶舱

Django数据驾驶舱 1.项目介绍2.项目结构3.库表结构3.1 appcsdn的models3.2 appssq的models3.3 appweather的models3.4 appweibo的models 4.功能展示5.解决问题5.1 路由配置5.2 后端数据与前端echarts展示5.3 长图表丝滑滚动条 6.遗留问题7.资源分享 1.项目介绍 这里介绍本人最…

excel数据透视

Excel中&#xff0c;数据透视图&#xff08;PivotChart&#xff09;和数据透视表&#xff08;PivotTable&#xff09;是两个紧密相关的工具&#xff0c;用于分析数据。数据透视表是数据透视图的数据源&#xff0c;也就是说&#xff0c;数据透视图是基于数据透视表中的数据创建的…

判断题无答案22届期末复习

判断: 1-3.结构体变量不能进行整体输入输出。 1-4.不同类型的结构变量之间也可以直接赋值。 1-5假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 (*p).num = 100; 等价于p->num=1…

Linux下多进程访问同一个共享库处理流程

两个测试程序实现调用同一个SO库: ​​​​​​​ #include <stdio.h> #include "a/a.h" #include <unistd.h> int main() { int a = 4,b = 5; sum(a, b); int ret = get(); printf("ret=%d\n", ret); sleep(100)…

如何用好swoole/webman/workerman/hyperf呢

Webman框架的依赖 "require": { "php": ">7.2", "workerman/webman-framework": "^1.5.0",// "monolog/monolog": "^2.0" }, 依赖的核心框架也是很久的了 webman-framework的核心依赖 &q…

Ubuntu下FastDDS的源码编译和简单测试

FastDDS是eprosima公司开发的DDS&#xff08;Data Distribution Service&#xff09;库&#xff0c;使用的语言是C&#xff0c;自称是"The Most Complete Open Source DDS Middleware"&#xff0c;其官网是https://eprosima.com/&#xff0c;FastDDS源码在https://gi…

【面试干货】HashSet 和 TreeSet 的区别

【面试干货】HashSet 和 TreeSet 的区别 1、实现方式HashSetTreeSet 2、性能添加、删除和查找操作的时间复杂度HashSetTreeSet 3、元素唯一性4、迭代顺序HashSetTreeSet 5、使用场景HashSetTreeSet 6、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不…