news 2026/8/13 17:16:33

LeetCode 面试经典 150_回溯_电话号码的字母组合(98_17_C++_中等)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 面试经典 150_回溯_电话号码的字母组合(98_17_C++_中等)

LeetCode 面试经典 150_回溯_电话号码的字母组合(98_17_C++_中等)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(递归(回溯)):
      • 代码实现
        • 代码实现(思路一(递归(回溯))):
        • 以思路一为例进行调试
        • 部分代码解读

题目描述:

给定一个仅包含数字 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)。

代码实现

代码实现(思路一(递归(回溯))):
classSolution{private://存储号码与字母的对应关系unordered_map<char,string>map;//记录一种电话号码的字母组合vector<char>path;//存储所有的电话号码字母组合vector<string>ans;//创建号码与字母的对应关系voidcreateMap(){map['2']="abc";map['3']="def";map['4']="ghi";map['5']="jkl";map['6']="mno";map['7']="pqrs";map['8']="tuv";map['9']="wxyz";}voidbacktracking(string digits,intn){//当一个组合中字母数量达到要求是存储到ans中if(path.size()==digits.size()){//将char类型的path进行拼接装入ansans.emplace_back(string(path.begin(),path.end()));return;}//str代表当前号码对应的字母string str=map[digits[n]];for(inti=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和path,防止上次调用残留数据ans.clear();path.clear();//如果未输入号码则返回 []if(digits=="")returnans;//创建号码与字母的对应关系createMap();//电话号码的字母组合backtracking(digits,0);returnans;}};
以思路一为例进行调试
#include<iostream>#include<vector>#include<unordered_map>usingnamespacestd;classSolution{private://存储数字与字母的对应关系unordered_map<char,string>map;//记录一种电话号码的字母组合vector<char>path;//存储所有的电话号码字母组合vector<string>ans;//创建数字与字母的对应关系voidcreateMap(){map['2']="abc";map['3']="def";map['4']="ghi";map['5']="jkl";map['6']="mno";map['7']="pqrs";map['8']="tuv";map['9']="wxyz";}voidbacktracking(string digits,intn){//当一个组合中字母数量达到要求是存储到ans中if(path.size()==digits.size()){//将char类型的path进行拼接装入ansans.emplace_back(string(path.begin(),path.end()));return;}//str代表当前号码对应的字母string str=map[digits[n]];for(inti=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=="")returnans;//创建号码与字母的对应关系createMap();//电话号码的字母组合backtracking(digits,0);returnans;}};intmain(intargc,charconst*argv[]){string digits="23";//电话号码的字母组合Solution s;vector<string>ans=s.letterCombinations(digits);//输出电话号码的字母组合for(constauto&i:ans){cout<<i<<" ";}return0;}
部分代码解读

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

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

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

LeetCode 面试经典 150_回溯_电话号码的字母组合(98_17)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 12:53:39

15 分钟获现场信号,30 分钟建指挥链路!分布式系统赋能救援 “秒响应”

进入二十世纪以来&#xff0c;全球气候异常加剧&#xff0c;环境破坏引发的连锁反应日益显著 —— 地震震级攀升、洪水波及范围扩大、台风登陆频次增多、山火蔓延速度加快&#xff0c;各类自然灾害不仅造成巨大的人员伤亡与财产损失&#xff0c;更对突发事件的应急响应速度、指…

作者头像 李华
网站建设 2026/8/12 11:42:59

自动化测试中的常见陷阱与规避

随着软件交付周期的不断缩短&#xff0c;自动化测试已成为保障产品质量的关键手段。然而&#xff0c;许多团队在实施过程中陷入重复性陷阱&#xff0c;导致投入产出比失衡。 一、常见陷阱深度解析 1. 过度追求覆盖率陷阱 现象&#xff1a;盲目要求100%测试覆盖率&#xff0c;…

作者头像 李华
网站建设 2026/8/12 11:56:58

6-4 WPS JS宏 不重复随机取值应用

1.示例&#xff1a;function 不重复随机取值(){var snew Set();if(10-1>8){while(true){var numWorksheetFunction.RandBetween(1,10);//RandBetween(1,10)为随机函数s.add(num);if(s.size8){break};//size为集合的个数}}var arr[...s]Console.log(${arr})}function 不重复随…

作者头像 李华
网站建设 2026/8/12 12:53:27

《余行论》第七篇:历史篇

第七篇&#xff1a;历史篇——文明如长河&#xff0c;兴衰皆余行引言&#xff1a;历史是宇宙的备忘录&#xff0c;还是人类的独白&#xff1f;历史是什么&#xff1f;是帝王将相的谱系&#xff0c;是战争与和平的循环&#xff0c;是生产力进步的阶梯&#xff0c;还是偶然事件的…

作者头像 李华
网站建设 2026/8/11 19:32:28

《余行论》第九篇:证验篇

第九篇&#xff1a;证验篇——理可玄思&#xff0c;亦可实证引言&#xff1a;从哲学构想到科学纲领前八篇构建的“余行论”&#xff0c;以其宏大的视野与内在的融贯性&#xff0c;描绘了一幅从宇宙本源到人类文明的统一图景。然而&#xff0c;一个深邃的哲学思辨若想真正成为推…

作者头像 李华
网站建设 2026/8/12 21:09:20

构建动态响应式动画架构:lottie-ios与现代数据流技术融合实践

构建动态响应式动画架构&#xff1a;lottie-ios与现代数据流技术融合实践 【免费下载链接】lottie-ios airbnb/lottie-ios: Lottie-ios 是一个用于 iOS 平台的动画库&#xff0c;可以将 Adobe After Effects 动画导出成 iOS 应用程序&#xff0c;具有高性能&#xff0c;易用性和…

作者头像 李华