【LeetCode每日一题】——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'] 的一个数字。

七【解题思路】

  • 但凡涉及到组合类的题目,基本都使用回溯算法解决,本题也不例外,不过是在原本的基础上添加映射关系
  • 根据题目信息可知,我们最终组合的是字母,但是输入数据为数字,所以需要简历一个数字到字母的映射
  • 其余步骤和正常的回溯过程一致
    • 设置边界条件:如果所有的数字都遍历完毕了,就完成此次计算
    • 回溯拼接某一电话号码对应的字母:和正常的回溯过程一致,不过需要先取出数字对应的字母进行回溯
  • 最后返回结果即可
  • 具体细节可以参考下面的代码

八【时间频度】

  • 时间复杂度: O ( 3 m × 4 n ) O(3^m × 4^n) O(3m×4n) m m m 3 3 3个字母对应的数字个数, n n n 4 4 4个字母对应的数字个数
  • 空间复杂度: O ( m + n ) O(m + n) O(m+n) m m m 3 3 3个字母对应的数字个数, n n n 4 4 4个字母对应的数字个数

九【代码实现】

  1. Java语言版
class Solution {

    // 数字和字母的映射
    private static final String[] phoneMap = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz",
    };

    public List<String> letterCombinations(String digits) {
        // 边界条件的判断
        if (digits == null || digits.length() == 0) {
            return new ArrayList<>();
        }
        // 存储最终结果
        List<String> res = new ArrayList<>();
        // 从第一个电话号码开始计算
        dfs(res, new StringBuffer(), digits, 0);
        // 返回最终结算结果
        return res;
    }

    // 使用回溯计算电话号码的字母组合
    private void dfs(List<String> res, StringBuffer temp, String digits, int index) {
        // 将所有电话号码遍历完毕即可返回
        if (index == digits.length()) {
            res.add(temp.toString());
            return;
        }
        // 回溯拼接某一电话号码对应的字母
        char digit = digits.charAt(index);
        String letters = phoneMap[digit - '0'];
        
        for (int i = 0; i < letters.length(); i++) {
            temp.append(letters.charAt(i));
            dfs(res, temp, digits, index + 1);
            temp.deleteCharAt(temp.length() - 1);
        }
    }

}
  1. Python语言版
class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        # 边界条件的判断
        if not digits:
            return list()
        
        # 数字和字母的映射
        phoneMap = {
            "2" : "abc",
            "3" : "def",
            "4" : "ghi",
            "5" : "jkl",
            "6" : "mno",
            "7" : "pqrs",
            "8" : "tuv",
            "9" : "wxyz",
        }

        # 存储最终结果
        res = list()

        # 存储临时结果
        temp = list()

        # 使用回溯计算电话号码的字母组合
        def dfs(index):
            # 将所有电话号码遍历完毕即可返回
            if index == len(digits):
                res.append("".join(temp))
                return
            # 回溯拼接某一电话号码对应的字母
            digit = digits[index]
            for letter in phoneMap[digit]:
                temp.append(letter)
                dfs(index + 1)
                temp.pop()
        
        # 从第一个电话号码开始计算
        dfs(0)

        # 返回最终结算结果
        return res
  1. C++语言版
class Solution {

public:

    // 数字和字母的映射
    const vector<string> phoneMap = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz",
    };

    // 使用回溯计算电话号码的字母组合
    void dfs(vector<string>& res, string& temp, string digits, int index) {
        // 将所有电话号码遍历完毕即可返回
        if (index == digits.size()) {
            res.push_back(temp);
            return;
        }
        // 回溯拼接某一电话号码对应的字母
        int digit = digits[index] - '0';
        const string& letters = phoneMap[digit];
        for (char letter : letters) {
            temp.push_back(letter);
            dfs(res, temp, digits, index + 1);
            temp.pop_back();
        }
    }

    vector<string> letterCombinations(string digits) {
        // 存储最终结果
        vector<string> res;
        // 边界条件的判断
        if (digits.empty()) {
            return res;
        }
        // 存储临时结果
        string temp;
        // 从第一个电话号码开始计算
        dfs(res, temp, digits, 0);
        // 返回最终结算结果
        return res;
    }
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C++语言版
    在这里插入图片描述


http://www.niftyadmin.cn/n/5689343.html

相关文章

Python 3 和 MySQL(PyMySQL) 的完美结合

Python 3 和 MySQL(PyMySQL) 的完美结合 在当今的数据驱动世界中,数据库是任何应用程序的核心组成部分。MySQL 作为最流行的开源关系数据库管理系统之一,以其可靠性、易用性和高性能而受到广泛青睐。而 Python,作为一种高级编程语言,以其简洁明了的语法和强大的库支持,成…

Linux --入门学习笔记

文章目录 Linux概述基础篇Linux 的安装教程 ⇒ 太简单了&#xff0c;百度一搜一大堆。此处略……Linux 的目录结构常用的连接 linux 的开源软件vi 和 vim 编辑器Linux 的关机、开机、重启用户登录和注销用户管理添加用户 ⇒ ( useradd 用户名 ) &#xff08; useradd -d 制定目…

vue框架和uniapp框架区别

文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…

数据治理006-数据标准的管理

元数据的分类和标准有哪些&#xff1f; 一、元数据的分类 元数据可以根据其描述的对象和属性不同&#xff0c;被分为不同的类型。以下是几种常见的元数据分类方法&#xff1a; 基于数据的类型&#xff1a;根据数据的类型&#xff0c;元数据可以被分为结构化元数据、非结构化元…

第九章---for循环及在STL的应用(vector\map\set\list\for_each)、嵌套while、while 统一输出、do-while

在C中&#xff0c;循环语句用于重复执行一段代码&#xff0c;直到指定的条件不再满足。C 提供了几种循环机制&#xff0c;下面将详细讲解每种循环语句的用法和特点。 1. for 循环 for 循环是最常用的循环结构之一&#xff0c;它有三种基本形式&#xff1a; 基本形式&#xf…

github/git密钥配置与使用

零、前言 因为要在ubuntu上做点东西&#xff0c;发现git clone 的时候必须输账户密码&#xff0c;后来发现密码是token&#xff0c;但是token一大串太烦了&#xff0c;忙了一天发现可以通过配置 公钥 来 替代 http 的 部署方式。 一、生成 ssh 密钥对 我们先测试下能不能 连接…

MybatisPlus代码生成器的使用

在使用MybatisPlus以后&#xff0c;基础的Mapper、Service、PO代码相对固定&#xff0c;重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用&#xff0c;也很麻烦。 这里推荐大家使…

King of Range 2024牛客国庆集训派对day3

原题 King of Range 解析 m 的值不大, 每次时间在 n logn 以内即可 我们遍历整个数组, 以 i 为右边界, 检测是否有满足条件的左边界, 一次只加上左面的所有可能, 用两个双向队列维护两个单调栈, 一个存最大值, 一个存最小值, 这样可以帮助找到合适的左边界 代码 #include …