LeetCode 热题 100_电话号码的字母组合 (57_17_中等_C++)(string(path.begin(),path.end()))

server/2025/1/25 4:06:39/

LeetCode 热题 100_电话号码的字母组合(57_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、本题其实就是我们日常打字中使用九键拼音,通过9个按键不同的组合,形成不同的字母组合。假设第一次按的是 1 键则从 [a,b,c] 中选取一个字母,第二次按的是 7 键,则从 [p,q,r,s] 中选取一个字母,以此类推。最后将选出的字母按照顺序依次进行组合,就是电话号码的字母组合。为了能快速的得到数字与字母的对应关系,我们需将其关系存入哈希表。(不定次数的多重循环转换为递归问题

2、复杂度分析:
① 时间复杂度:O(3m*4n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数(可转换为多重循环问题进行理解)。

② 空间复杂度:O(m+n),递归需要 m+n空间(每层挑选一个字母),哈希表为固定的常熟O(1)。

代码实现

代码实现(思路一(递归(回溯))):
class Solution {
private://存储号码与字母的对应关系unordered_map<char,string> map;//记录一种电话号码的字母组合vector<char> path;//存储所有的电话号码字母组合vector<string> ans;//创建号码与字母的对应关系void createMap(){map['2']="abc";map['3']="def";map['4']="ghi";map['5']="jkl";map['6']="mno";map['7']="pqrs";map['8']="tuv";map['9']="wxyz";}void backtracking(string digits,int n){//当一个组合中字母数量达到要求是存储到ans中if(path.size()==digits.size()){//将char类型的path进行拼接装入ansans.emplace_back(string(path.begin(),path.end()));return;}//str代表当前号码对应的字母string str=map[digits[n]];for (int i = 0; i < str.size(); i++){//将字母存入path中path.emplace_back(str[i]);//挑选下一个号码对应的字母backtracking(digits,n+1);//回溯path.pop_back();}}public:vector<string> letterCombinations(string digits) {//清空ans,防止上次调用残留数据ans.clear();//如果未输入号码则返回 []if (digits=="") return ans;//创建号码与字母的对应关系createMap();//电话号码的字母组合backtracking(digits,0);return ans;}
};
以思路一为例进行调试
#include<iostream>
#include <vector>
#include<unordered_map>
using namespace std;class Solution {
private://存储数字与字母的对应关系unordered_map<char,string> map;//记录一种电话号码的字母组合vector<char> path;//存储所有的电话号码字母组合vector<string> ans;//创建数字与字母的对应关系void createMap(){map['2']="abc";map['3']="def";map['4']="ghi";map['5']="jkl";map['6']="mno";map['7']="pqrs";map['8']="tuv";map['9']="wxyz";}void backtracking(string digits,int n){//当一个组合中字母数量达到要求是存储到ans中if(path.size()==digits.size()){//将char类型的path进行拼接装入ansans.emplace_back(string(path.begin(),path.end()));return;}//str代表当前号码对应的字母string str=map[digits[n]];for (int i = 0; i < str.size(); i++){//将字母存入path中path.emplace_back(str[i]);//挑选下一个号码对应的字母backtracking(digits,n+1);//回溯path.pop_back();}}public:vector<string> letterCombinations(string digits) {//清空ans,防止上次调用残留数据ans.clear();//如果未输入号码则返回 []if (digits=="") return ans;//创建号码与字母的对应关系createMap();//电话号码的字母组合backtracking(digits,0);return ans;}
};int main(int argc, char const *argv[])
{string digits="23";//电话号码的字母组合Solution s;vector<string> ans=s.letterCombinations(digits);//输出电话号码的字母组合for (const auto &i : ans){cout<<i<<"  ";}return 0;
}
部分代码解读

string(path.begin(),path.end())

vector<char> path;
string(path.begin(),path.end())

这个方法通常用于将其他容器(例如 std::vector 或 std::deque)转换为 std::string。它将指定范围内的字符拷贝到新的 std::string 中。

LeetCode 热题 100_电话号码的字母组合 (57_17)原题链接
欢迎大家和我沟通交流(✿◠‿◠)


http://www.ppmy.cn/server/161206.html

相关文章

Webrtc (1) - Windows 编译

最近项目上遇到webrtc wgc 的几个test case无法通过&#xff0c;与webrtc人员沟通后决定要自行修复一下(因为他们不想管…) 参考文档 https://webrtc.org/support/contributinghttps://chromium.googlesource.com/chromium/src//main/docs/#checking-out-and-building 以上两…

SQL Server所有数据类型大全

数据类型列表 整数类型&#xff1a;bigint、int、smallint、tinyint精确数值类型&#xff1a;decimal、numeric近似数值类型&#xff1a;float、real字符类型&#xff1a;char、varchar、text、nchar、nvarchar、ntext日期和时间类型&#xff1a;date、time、datetime2、dateti…

MATLAB中characterListPattern函数用法

目录 语法 说明 示例 在文本中查找元音字母 提取在某字母范围内的字母 查找以元音字母开头的单词 将人名按字母顺序分组 characterListPattern函数的功能是匹配列表中的字符。 语法 pat characterListPattern(characters) pat characterListPattern(startCharacter,…

单例模式 - 单例模式的实现与应用

引言 单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中最简单且最常用的模式之一。它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。单例模式常用于需要全局唯一对象的场景&#xff0c;如配置管理、日志记录、线程池等。 本文将详细介…

宝塔UDP服务器部署记录,unityClient,pythonServer

最近项目接到新需求&#xff0c;需要用Unity 客户端&#xff08;发送端&#xff09;控制另一台 Unity 客户端&#xff08;接收端&#xff09;&#xff0c;中间用UDP服务器做数据中转。 先测试一下连通性&#xff0c;我用 Python 搞了个服务器 demo。 在正式开发之前&#xff…

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测&#xff1a;在大跨度桥梁的主跨部分&#xff0c;如悬索桥的主缆、斜拉桥的斜拉索和主梁&#xff0c;分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况&#xff0c;能够精确捕捉到车辆荷载、风荷…

通过Python编程语言实现“机器学习”小项目教程案例

1. Python与机器学习概述 1.1 Python语言特点 Python是一种广泛使用的高级编程语言&#xff0c;具有简洁、易读、易学的特点&#xff0c;这使得它成为初学者和专业人士的首选语言之一。 简洁性&#xff1a;Python的语法简洁明了&#xff0c;减少了代码量&#xff0c;提高了开…

skynet 源码阅读 -- 核心概念服务 skynet_context

本文从 Skynet 源码层面深入解读 服务&#xff08;Service&#xff09; 的创建流程。从最基础的概念出发&#xff0c;逐步深入 skynet_context_new 函数、相关数据结构&#xff08;skynet_context, skynet_module, message_queue 等&#xff09;&#xff0c;并通过流程图、结构…