LeetCode刷题--- 电话号码的字母组合

个人主页: 元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

http://t.csdnimg.cn/yUl2I

【C++】

http://t.csdnimg.cn/6AbpV

数据结构与算法

http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


电话号码的字母组合

题目链接: 电话号码的字母组合
题目

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

解法

题目解析

题目的意思非常简单,给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出了数字到字母的映射。

示例 1:

复制代码
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

算法原理思路讲解

一、画出决策树

"23"为例子

决策树就是我们后面设计函数的思路


二、设计代码

(1)全局变量

  1. 首先这里有映射,我们便可以创建一个 哈希表 phoneMap。记录 2~9 各⾃对应的字符。

  2. 一个数组 ret ,用来存储字母组合

  3. 一个 字符串 path,用来记录存储字母

    unordered_map<char, string> phoneMap
    {
    {'2', "abc"},
    {'3', "def"},
    {'4', "ghi"},
    {'5', "jkl"},
    {'6', "mno"},
    {'7', "pqrs"},
    {'8', "tuv"},
    {'9', "wxyz"}
    };
    vector<string> ret;
    string path;

(2)设计递归函数

复制代码
void dfs(string digits,int pos)
  • 参数:pos (已经处理的元素个数)
  • 返回值:⽆
  • 函数作⽤:查找所有合理的字⺟组合并存储在答案列表中。

递归函数流程如下:

  1. 递归结束条件:当 pos 等于 digits 的⻓度时,将 path 加⼊到 ret 中并返回;
  2. 取出当前处理的数字 digit,根据 phoneMap 取出对应的字⺟列表 letters;
  3. 遍历字⺟列表 letters,将当前字⺟加⼊到组合字符串 path 的末尾,然后递归处理下⼀个数字(传入pos + 1,表⽰处理下⼀个数字);
  4. 递归处理结束后,将加⼊的字⺟从 path 的末尾删除,表⽰回溯。
  5. 最终返回 ret 即可。

以上思路讲解完毕,大家可以自己做一下了


代码实现

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

  • 空间复杂度:O(m+n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n 是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n。

    class Solution
    {
    public:
    unordered_map<char, string> phoneMap
    {
    {'2', "abc"},
    {'3', "def"},
    {'4', "ghi"},
    {'5', "jkl"},
    {'6', "mno"},
    {'7', "pqrs"},
    {'8', "tuv"},
    {'9', "wxyz"}
    };
    vector<string> ret;
    string path;

    复制代码
      void dfs(string digits,int pos)
      {
          if (pos == digits.size())
          {
              ret.push_back(path);
              return ;
          }
          char digit = digits[pos];
          const string& letters = phoneMap[digit];
    
    
          for (int i = 0; i < letters.size(); i++)
          {
              path += letters[i];
              dfs(digits,pos+1);
              path.pop_back();
          }
      }
      vector<string> letterCombinations(string digits) 
      {
          if (digits.empty())
          {
              return ret;;
          }
          dfs(digits,0);
    
          return ret;
      }

    };

相关推荐
好易学·数据结构5 分钟前
可视化图解算法75:最长上升子序列(最长递增子序列)
数据结构·算法·leetcode·动态规划·力扣·牛客网
Jeremy爱编码5 分钟前
leetcode热题岛屿数量
算法·leetcode·职场和发展
闻缺陷则喜何志丹7 分钟前
【组合数学 动态规划】P6870 [COCI2019-2020#5] Zapina|普及+
c++·数学·算法·动态规划·组合数学
zl_vslam10 分钟前
SLAM中的非线性优-3D图优化之相对位姿Between Factor-SO3/t形式(十一)
人工智能·算法·计算机视觉·3d
aini_lovee16 分钟前
基于 OpenCV 的模板匹配算法的 C 语言实现
c语言·opencv·算法
core51217 分钟前
EM 算法 (期望最大化):在迷雾中寻找真相
算法·em·期望最大化
CoovallyAIHub17 分钟前
YOLO11-4K:面向4K全景图像的高效实时检测框架,CVIP360数据集开源
深度学习·算法·计算机视觉
安_25 分钟前
java Arrays.sort 用的什么算法
java·算法·排序算法
蓝色汪洋26 分钟前
数字(加强版)
算法
进击的小头27 分钟前
02_嵌入式C与控制理论入门:自动控制理论核心概念拆解
c语言·单片机·算法