【面试经典 150 | 回溯】电话号码的字母组合

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:回溯
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【字符串】【回溯】


题目来源

17. 电话号码的字母组合


解题思路

方法一:回溯

思路

给定一个仅包含数字 2-9 的字符,现在需要返回它能表示的字母组合。每个数字会和几个字符形成映射,因此需要先使用一个哈希表建立映射关系。

建立好哈希表之后,利用「回溯」枚举出所有可能的字母组合。所谓的「回溯」指的是从问题的某一状态出发沿着某一分支前进,当这条分支走到尽头时,回退一步,从另一种可能的状态出发,如此往复,直至走完所有的路径。

对于示例 1 就是从数字字符的第一个字符 ‘2’ 出发,‘2’ 在哈希表中对应三个字符 ,我们选择一个字符作为分支出发,比如字符 ‘a’;继续出发遇到第二个数字字符 ‘3’,‘3’ 在哈希表中也对应三个字符 ,比如我们选择字符 ‘d’ 出发,这时走到路径尽头了;于是回退一步从 ‘3’ 在哈希表中对应的三个字符出选出另一个字符…如此便可以得到 “ad”、“ae”、“af” 三个字符。这时候再回退一步从 ‘2’ 在哈希表中对应的三个字符出选出另一个字符,如此就能依次得到字符 “bd”, “be”, “bf”, “cd”, “ce”, “cf”。

代码

class Solution {
private:unordered_map<char, string> num2Alpha = {{'2', "abc"},{'3', "def"},{'4', "ghi"},{'5', "jkl"},{'6', "mno"},{'7', "pqrs"},{'8', "tuv"},{'9', "wxyz"}};    vector<string> ret;string str;void dfs(string digits, int idex){if(idex == digits.size()){ret.push_back(str);return;}string alpha = num2Alpha[digits[idex]];for(auto &c : alpha){str.push_back(c);dfs(digits, idex+1);str.pop_back();}}
public:vector<string> letterCombinations(string digits) {if(digits.empty()){return ret;}dfs(digits, 0);return ret;}
};

复杂度分析

时间复杂度: O ( 3 m × 4 m ) O(3^m \times 4^m) O(3m×4m),其中 m m m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8), n n n 是输入中对应 4 个字母的数字个数(包括数字 7、9)。当输入包含 m m m 个对应 3 个字母的数字和 n n n 个对应 4 个字母的数字时,不同的字母组合一共有 3 m × 4 n 3^m \times 4^n 3m×4n 种,需要遍历每一种字母组合。

空间复杂度: O ( m + n ) O(m+n) O(m+n)。空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m + n m+n m+n


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

低代码技术与仓储管理的新纪元:革命性的供应链变革

引言 在当今数字化时代&#xff0c;企业对于创新和效率的追求越发迫切。在这样的背景下&#xff0c;低代码技术应运而生&#xff0c;成为企业数字化转型的重要工具之一。低代码技术的崛起为企业提供了一种快速、灵活、成本效益高的开发方式&#xff0c;大大缩短了软件开发周期…

人工智能好多人都在用,那么用户画像要怎么看?

用户画像是通过对用户行为、偏好、兴趣等数据进行分析和整理&#xff0c;从而形成的关于特定用户群体的描述和模型。在人工智能应用中&#xff0c;用户画像可以起到指导个性化推荐、精准营销、产品设计等方面的作用。以下是用户画像在人工智能应用中的几个重要方面&#xff1a;…

SecuPress Pro 专业级WordPress网站安全防护插件优化版

下载地址&#xff1a;SecuPress Pro 专业版.zip SecuPress Pro&#xff1a;专业的WordPress安全解决方案 如果您没有时间进行每周扫描&#xff0c;SecuPress Pro将是您的理想选择。SecuPress Pro提供了所有SecuPress Free的功能&#xff0c;同时还增加了一些高级选项&#xff…

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

一次违法网站的渗透经历

0x01 前言 在一次攻防演练中&#xff0c;我发现了一个有趣的渗透路径。在信息收集阶段&#xff0c;我注意到目标网站和用户资产网站共享相同的IP网段。这意味着它们可能在同一台服务器上托管&#xff0c;或者至少由同一家互联网服务提供商管理。这种情况为我们的渗透测试提供了…

Java本地缓存技术选型(Guava Cache、Caffeine、EhCache)

前言 对一个java开发者而言&#xff0c;提到缓存&#xff0c;第一反应就是Redis。利用这类缓存足以解决大多数的性能问题了&#xff0c;我们也要知道&#xff0c;这种属于remote cache&#xff08;分布式缓存&#xff09;&#xff0c;应用的进程和缓存的进程通常分布在不同的服…

046、注意力机制

之——从心理学出发 杂谈 动物需要在复杂环境下有效关注值得注意的点。 人类根据随意线索和不随意线索选择关注的点。 正文 1.线索 不随意&#xff08;随着意识&#xff09;线索&#xff08;不主动&#xff09;&#xff0c;随意&#xff08;随着意识&#xff09;&#xff08;主…

【opencv 加速推理】如何安装 支持cuda的opencv 包 用于截帧加速

要在支持CUDA的系统上安装OpenCV&#xff0c;您可以使用pip来安装支持CUDA的OpenCV版本。OpenCV支持CUDA加速&#xff0c;但需要安装额外的库&#xff0c;如cuDNN和NVIDIA CUDA Toolkit。以下是一般步骤&#xff1a; 安装NVIDIA CUDA Toolkit: 首先&#xff0c;您需要安装NVID…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…

python中如何用matplotlib写饼图

#代码 import matplotlib.pyplot as plt# 设置绘图的主题风格 plt.style.use(ggplot) # 中文乱码和坐标轴负号的处理 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False plt.rcParams[figure.figsize][10,8] # 构造数据 x [0.2515,0.3724,0.3336…

第三届锐捷全国大学生信息技术大赛报名启动,丰厚奖金等你挑战

2024年4月10日,ICT行业全国赛事第三届锐捷大赛已启动初赛报名,初赛阶段的报名截止日期为5月24日。锐捷全国大学生信息技术大赛(以下简称锐捷大赛)是锐捷网络面向全国大学生打造的人才竞技交流赛事,旨在促进学生综合素质、专业化水平和创新能力的整体提升,培养符合社会用人标准的…

视频转换难?这款视频转换器,让你高效完成转换

随着数字媒体技术的快速发展&#xff0c;视频格式的多样性常常让人感到困扰。不同的设备、不同的平台&#xff0c;视频文件可能都要转换成对应的格式和大小才能让用户正常观看。为了满足人们对视频格式转换的需求&#xff0c;多种类型的视频转换器应运而生&#xff0c;它们能够…