LeetCode 算法:电话号码的字母组合 c++

news2024/11/22 21:48:19

原题链接🔗:电话号码的字母组合
难度:中等⭐️⭐️

题目

给定一个仅包含数字 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. 解题思路

LeetCode 上的 “电话号码的字母组合” 问题要求你根据一个数字电话号码,生成所有的可能的字母组合。在这个问题中,每个数字键对应一组字母,例如:

  • 2 对应 ‘a’, ‘b’, ‘c’
  • 3 对应 ‘d’, ‘e’, ‘f’

解题思路如下:

  1. 理解问题:首先,要清楚每个数字键对应的字母组合,以及电话号码可能的组合方式。

  2. 回溯法:这是一个典型的回溯问题,我们可以使用回溯法来解决。回溯法是一种通过递归来搜索所有可能解的方法。

  3. 构建映射:创建一个映射,将每个数字键映射到它对应的字母组合。

  4. 递归生成组合:使用递归函数,每次递归调用时,尝试当前数字键的所有可能字母,并将其添加到当前的组合中。

  5. 回溯:在递归过程中,如果当前组合的长度等于电话号码的长度,说明找到了一个有效的组合,将其添加到结果中。然后回溯,移除当前添加的字母,尝试下一个字母。

  6. 优化:在生成组合的过程中,如果当前数字键没有对应的字母,直接回溯到上一个数字键。

下面是这个问题的一般性解题步骤:

  • 定义一个映射 digitToChar,将每个数字映射到对应的字母字符串。
  • 定义一个递归函数 backtrack,接收当前的组合 current,当前处理的数字索引 index,以及电话号码 digits 作为参数。
  • backtrack 函数中,如果 index 等于电话号码的长度,将当前的组合 current 添加到结果 result 中。
  • 对于当前索引 index,获取当前数字对应的所有字母,然后对每个字母进行递归调用 backtrack,并将字母添加到当前组合 current 中。
  • 在递归调用后,需要回溯,即从 current 中移除最后添加的字母。
  1. c++ demo
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> combinations;
        if (digits.empty()) {
            return combinations;
        }
        unordered_map<char, string> phoneMap{
            {'2', "abc"},
            {'3', "def"},
            {'4', "ghi"},
            {'5', "jkl"},
            {'6', "mno"},
            {'7', "pqrs"},
            {'8', "tuv"},
            {'9', "wxyz"}
        };
        string combination;
        backtrack(combinations, phoneMap, digits, 0, combination);
        return combinations;
    }

    void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) {
        if (index == digits.length()) {
            combinations.push_back(combination);
        }
        else {
            char digit = digits[index];
            const string& letters = phoneMap.at(digit);
            for (const char& letter : letters) {
                combination.push_back(letter);
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.pop_back();
            }
        }
    }
};


int main() {
    Solution solution;
    std::string digits = "23";
    std::vector<std::string> combinations = solution.letterCombinations(digits);

    for (const std::string& combination : combinations) {
        std::cout << combination << std::endl;
    }
    return 0;
}
  1. 代码仓库地址:letterCombinations

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

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

相关文章

线程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

线程 线程概念 简介 线程定义&#xff1a;线程是操作系统进行调度的最小单位&#xff0c;包含在进程内&#xff0c;是进程中的实际执行单元 线程特性&#xff1a;一个线程代表进程中的一个单一顺序控制流&#xff0c;即执行路径 多线程应用&#xff1a;一个进程可以包含多个…

LabVIEW红外热波图像缺陷检

开发使用LabVIEW开发的红外热波图像缺陷检测系统。该系统结合红外热像仪、工业相机和高效的数据采集硬件&#xff0c;实现对工件表面缺陷的自动检测和分析。通过LabVIEW的强大功能&#xff0c;系统能够实时采集、处理和显示红外热波图像&#xff0c;有效提高了检测的精度和效率…

时域分析----移动平均滤波器介绍及其在金融应用示例

介绍 移动平均滤波器&#xff08;Moving Average Filter&#xff09;是一种基本但功能强大的信号处理技术&#xff0c;广泛应用于各种数据平滑和去噪任务中。其主要目的是通过对数据进行平均处理&#xff0c;减少随机波动和噪声&#xff0c;从而突出数据中的趋势和规律。移动平…

Win11任务栏当中对 STM32CubeMX 的堆叠问题

当打开多个 CubeMX 程序的时候&#xff0c;Win11 自动将其进行了堆叠&#xff0c;这时候就无法进行预览与打开。 问题分析&#xff1a;大部分ST的工具都是基于 JDK 来进行开发的&#xff0c;Win11 将其识别成了同一个 Binary 但是实际上他们并不是同一个&#xff0c;通过配置…

数据治理项目中,数据运营团队如何搭建能提升数据应用效果?

引言&#xff1a;在数据治理项目中&#xff0c;数据运营团队的搭建对于提升数据应用效果具有关键作用。以下是一些具体的步骤和策略&#xff0c;用于构建高效的数据运营团队以优化数据应用效果&#xff1a; 一、明确团队目标和职责 确定数据应用目标&#xff1a;首先&#xf…

【接口自动化_06课_Pytest+Excel+Allure完整框架集成】

一、logging在接口自动化里的应用 1、设置日志的配置&#xff0c;并收集日志文件 日志的设置需要在pytest.ini文件里设置。这个里面尽量不要有中文 2、debug日志的打印 pytest.ini文件的开关一定得是true才能在控制台打印日志 import allure import pytest from P06_PytestFr…

JavaScript(9) ----this指向问题,bind,call,apply等方法

目录 this指向问题 全局函数调用&#xff1a; 对象方法调用&#xff1a; 构造函数调用&#xff1a; 事件处理&#xff1a; 箭头函数&#xff1a; setTimeout和setInterval 7.使用call、apply或bind call 方法 apply 方法 bind 方法 总结 this指向问题 全局函数调用…

基于conda包的环境创建、激活、管理与删除

Anaconda是一个免费、易于安装的包管理器、环境管理器和 Python 发行版&#xff0c;支持平台包括Windows、macOS 和 Linux。下载安装地址&#xff1a;Download Anaconda Distribution | Anaconda 很多不同的项目可能需要使用不同的环境。例如某个项目需要使用pytorch1.6&#x…

STM32MP135裸机编程:支持内存非对齐访问

0 前言 使用stm32官方可视化初始化代码生成工具STM32CubeMX生成的工程GCC编译选项默认不支持非对齐访问&#xff0c;在我们进行非对齐的访问时就会进入数据异常中断DAbt中。为了解决这一问题&#xff0c;我们需要在GCC编译选项中加上一处配置。 1 操作方法 右键STM32CubeIDE…

ArkTS基础快速入门

初识ArkTS语言 ArkTS&#xff1a;是一门用于开发鸿蒙应用的编程语言。 ArkTS提供了声明式UI范式、状态管理支持等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发应用。 同时&#xff0c;它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础…

启动yarn后,其他节点没有NodeManager

写在前面&#xff1a; 这个问题虽然折磨了我两天&#xff0c;但是原因特别蠢&#xff0c;可能与各位不一定一样&#xff0c;我是因为ResourceManager的节点的"/etc/hadoop/workers"文件没有配置好&#xff08;没有配hadoop102和hadoop104&#xff09;&#xff0c;但排…

FPGA学习笔记(一) FPGA最小系统

文章目录 前言一、FPGA最小系统总结 前言 今天学习下FPGA的最小系统一、FPGA最小系统 FPGA最小系统与STM32最小系统类似&#xff0c;由供电电源&#xff0c;时钟电路晶振&#xff0c;复位和调试接口JTAG以及FLASH配置芯片组成&#xff0c;其与STM32最大的不同之处就是必须要有…

QQ频道导航退出

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140413538 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

three.js添加多个画布

多个场景的渲染需要多个画布&#xff0c;但是这样会导致加载模型纹理次数变多&#xff0c;基本方法是用一张canvas在整个背景中填充视口&#xff0c;利用其它元素作为每个虚拟画布&#xff0c;只在canvas中加载一个渲染器renderer&#xff0c;并为每个虚拟画布创建一个场景&…

实训第一天笔记

#初始化一个新的NPM项目(根据提示操作) npm init #安装TSC、TSLint和NodeJS的类型声明 npm install -s typescript tslint types/node 在根目录中新建一个名为tsconfig.json的文件&#xff0c;然后在代码编辑器中打开&#xff0c;写入下述内容&#xff1a; {"compilerO…

Chromium CI/CD 之Jenkins实用指南2024-如何创建新节点(三)

1. 前言 在前一篇《Jenkins实用指南2024-系统基本配置&#xff08;二&#xff09;》中&#xff0c;我们详细介绍了如何对Jenkins进行基本配置&#xff0c;包括系统设置、安全配置、插件管理以及创建第一个Job。通过这些配置&#xff0c;您的Jenkins环境已经具备了基本的功能和…

Qt文件下载工具

在Qt中实现文件下载功能&#xff0c;通常可以通过多种方式来完成&#xff0c;包括使用 QNetworkAccessManager 和 QNetworkReply 类&#xff0c;或者使用更高级别的 QHttpMultiPart 类。以下是两种常见的实现方法&#xff1a; 方法1&#xff1a;使用 QNetworkAccessManager 和…

AI操作系统势头正猛,以后LINUX,和window,Android,IOS等等的OS都将被AI OS所取代!

AI操作系统是一种旨在利用人工智能技术来优化和管理计算资源的操作系统。它不仅仅是一个传统意义上的操作系统&#xff0c;而是一个能够自主学习和适应用户需求的智能平台。以下是对AI操作系统的一些关键特点和它是否能取代现有操作系统的讨论&#xff1a; AI操作系统的关键特…

OpenCV图像处理——判断轮廓是否在圆环内

要判断一个轮廓是否在圆环内&#xff0c;可以将问题分解为两个步骤&#xff1a; 确保轮廓的所有点都在外圆内。确保轮廓的所有点都在内圆外。 下面是一个完整的示例代码&#xff0c;展示如何实现这一点&#xff1a; #include <opencv2/opencv.hpp> #include <iostr…

QT VTK 简单测试工程

目录 1 目录结构 2 文件源码 3 运行结果 4 报错及处理 使用编译好的VTK库进行测试 1 目录结构 2 文件源码 Pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. #…