LeetCode 17. 电话号码的字母组合 中等

题目 - 点击直达

  • [1. 17. 电话号码的字母组合 中等](#1. 17. 电话号码的字母组合 中等)
    • [1. 题目详情](#1. 题目详情)
      • [1. 原题链接](#1. 原题链接)
      • [2. 题目要求](#2. 题目要求)
      • [3. 基础框架](#3. 基础框架)
    • [2. 解题思路](#2. 解题思路)
      • [1. 思路分析](#1. 思路分析)
      • [2. 时间复杂度](#2. 时间复杂度)
      • [3. 代码实现](#3. 代码实现)
    • [3. 知识与收获](#3. 知识与收获)

1. 17. 电话号码的字母组合 中等

1. 题目详情

1. 原题链接

LeetCode 17. 电话号码的字母组合 中等

2. 题目要求

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"

输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:

输入:digits = ""

输出:[]
示例 3:

输入:digits = "2"

输出:["a","b","c"]

提示:
0 < = d i g i t s . l e n g t h < = 4 0 <= digits.length <= 4 0<=digits.length<=4
d i g i t s [ i ] digits[i] digits[i] 是范围 [ ′ 2 ′ , ′ 9 ′ ] ['2', '9'] [′2′,′9′]的一个数字。

3. 基础框架

● Cpp代码框架

cpp 复制代码
class Solution {
public:
    vector<string> letterCombinations(string digits) {
    }
};

2. 解题思路

全排列、多叉树的前序遍历

1. 思路分析

( 1 ) (1) (1) 首先建立数字与对应多个字符的映射;

string aStr[10] = {"", "", "abc", "def", "ghi","jkl","mno","pqrs","tuv","wxyz"};

0和1不对应字母,2-9依次对应字符串。
( 2 ) (2) (2) 例如字符串 d i g i t s digits digits=["237"],其中的2、3、4对应的字符串分别是["abc"]、["def"]、["pqrs"];

组合的结果共有 3 ∗ 3 ∗ 4 = 36 3*3*4=36 3∗3∗4=36种,即先在["abc"]中任取一个,然后在["def"]中任取一个,最后在["pqrs"]中任取一个,即 A 3 1 ∗ A 3 1 ∗ A 4 1 A_3^1 * A_3^1 * A_4^1 A31∗A31∗A41。
( 3 ) (3) (3) 把["abc"]、["def"]、["pqrs"]分别看做多叉树的第一层、第二层、第三层;

对这颗多叉树进行深度优先遍历就可以依次得到组合的结果:

第一层["abc"]首先选择第一个字符'a',第二层["def"]选择第一个字符'd',第三层["pqrs"]选择第一个字符'p',这样到达最后一层时相当于完成了一次深度优先遍历,也得到了一种组合["adp"];第三层共包含四个字符,故需要选择四次,共得到四种组合["adp"、"adq"、"adr"、"ads"];

之后回到第二层["def"],选择第二个字符'e',第三层依次选择["pqrs"]中的字符,得到四种组合["aep"、"aeq"、"aer"、"aes"];

之后再回到第二层["def"],选择第三个字符'f',第三层依次选择["pqrs"]中的字符,得到四种组合["afp"、"afq"、"afr"、"afs"];

这样第一层字符为'a'的所有组合都选择了一遍,对第一层中'a'字符之后的剩余字符继续进行上述遍历操作,得到以该字母开头的所有组合;
( 4 ) (4) (4) 多叉树的遍历本质与二叉树相同,二叉树节点只有两个,递归时只需递归左右子树即可;多叉树节点则有多个,递归时需要依次递归所有子树;
( 5 ) (5) (5) 递归函数的设计:

引用类型的结果二维数组vector<string>& ret

引用类型的字符串类型string& digits:所有栈帧都用到初始字符串参数;

int类型的index:当前栈帧内所在的digits的下标,也代表这在第几层,超过范围时类似于二叉树中节点为nullptr

string类型的一种结果字符串string comStr:每一层都会从当前层选择一个字符与comStr进行组合,当最后一层的字符与其组合后,便是一种结果,该结果继续传递给最后一层的下一层,在最后一层的下一层并不存在,此时i是越界的,函数将返回,再返回之前需要把最后一层得到并传入的结果尾插到结果二维数组中;

2. 时间复杂度

O ( 4 N ) O(4^N) O(4N)

范围[2, 9]数字对应的字符最少有 3 3 3个,最多有 4 4 4个,假设输入的数字长度为 N N N,且输入的数字对应的字符都是 4 4 4个。 N N N个数字对应 N N N个长度为 4 4 4的字符串,对一个长度为 4 4 4的字符串进行 4 4 4次选择,则对 N N N个长度为 4 4 4的字符串进行 4 N 4^N 4N次选择。

3. 代码实现

cpp 复制代码
class Solution {
    const static string aStr[10];
public:
    // 多叉树、回溯、全排列
    void combin(vector<string>& ret, const string& digits, int i, string comStr){
        // 递归结束条件
        if(i >= digits.size()){
            ret.push_back(comStr);
            return;
        }
        // 深度递归
        int index = digits[i] - '0';
        for(int j = 0; j < aStr[index].size(); ++j){
            combin(ret, digits, i + 1, comStr + aStr[index][j]);
        }
    }
    vector<string> letterCombinations(string digits) {
        vector<string> ret;
        if(digits.empty()) return ret;

        combin(ret, digits, 0, "");
        return ret;
    }
};
const string Solution::aStr[10] = {"", "", "abc", "def", "ghi","jkl","mno","pqrs","tuv","wxyz"};

3. 知识与收获

( 1 ) (1) (1) 二叉树深度优先遍历、回溯


T h e The The E n d End End

相关推荐
双叶8364 分钟前
(C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)
c语言·开发语言·数据结构·c++·list
孤独的追光者17 分钟前
论文阅读|汽车虚拟环绕音响系统设计与实现策略的比较研究
算法·汽车·音频·信号处理·数字信号处理
七七七七0717 分钟前
类与对象【下篇】-- 关于类的其它语法
c语言·开发语言·c++
黄皮の电气鼠25 分钟前
C++:继承
开发语言·c++·算法
shylyly_26 分钟前
专题一_双指针_查找总价格为目标值的两个商品
c++·算法·leetcode·双指针·查找总价格为目标值的两个商品·和为s的两个数
zzj_26261027 分钟前
高精度乘法
算法
我尽力学29 分钟前
HashMap的get、put流程源码分析
算法·哈希算法
R-G-B1 小时前
【03】MFC入门到精通——MFC 添加控件 设置属性 按钮 文本框
c++·mfc·mfc添加控件
IT猿手1 小时前
2025最新智能优化算法:沙狐优化(Rüppell‘s Fox Optimizer,RFO)算法求解23个经典函数测试集,完整MATLAB代码
android·算法·matlab·迁移学习·优化算法·动态多目标优化·动态多目标进化算法
liulilittle1 小时前
C/C++ inline-hook(x86)高级函数内联钩子
c语言·开发语言·汇编·c++·hook·底层·钩子