【刷题记录】17. 电话号码的字母组合

简介: 【刷题记录】17. 电话号码的字母组合

一、题目描述


来源:力扣(LeetCode)


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


二、思路分析


hashMap + DFS 深度优先搜索


  • 从题目中可以看出,每一个数字都对应字符数组。我们用可以map来存这个对应的关系
  • 其实每一个数字我们都可以看成一个树的节点,而对应的字符,就可以看作是这个节点下的分支
  • 每多一个数字,就相当于在分支的节点下多一个相应的情况分支。
  • 然后我们对这个树进行遍历即为我们想要的最终结果
    例如上面的示例 1:
    网络异常,图片无法展示
    |


代码实现

class Solution1 {
    Map<Character, String> map = new HashMap<Character, String>() {{
        put('2', "abc");
        put('3', "def");
        put('4', "ghi");
        put('5', "jkl");
        put('6', "mno");
        put('7', "pqrs");
        put('8', "tuv");
        put('9', "wxyz");
    }};
    public List<String> letterCombinations(String ds) {
        int length = ds.length();
        List<String> res = new ArrayList<>();
if (length ==0) return res;
        StringBuilder sb = new StringBuilder();
        dfs(ds, 0, length, sb, res);
        return res;
    }
    void dfs(String ds, int i, int n, StringBuilder sb, List<String> res) {
if (i == n) {
            res.add(sb.toString());
            return;
        }
        char key = ds.charAt(i);
        String letters = map.get(key);
for (int j =0; j < letters.length(); j++){
            sb.append(letters.charAt(j));
            dfs(ds, i +1 , n, sb, res);
            sb.deleteCharAt(sb.length() -1);
        }
    }
}


复杂度分析


时间复杂度:

网络异常,图片无法展示
|
,其中 m 是输入中对应 3 个字母的数字个数, n 是输入中对应 4 个字母的数字个数


空间复杂度:

网络异常,图片无法展示
|
。一共要生成
网络异常,图片无法展示
|
个结果


运行结果


网络异常,图片无法展示
|


总结


我们可以将问题模拟转为成我们相对比较熟悉的模型,这样能够帮助我们的更好的理解和更快的解决问题。

目录
相关文章
|
24天前
|
设计模式 人工智能 缓存
2025架构革命:一文深度揭秘AI四维进化(MoE/GraphRAG/智能体/HyDE)
本文深入解析大模型核心技术与实践原理,涵盖MCP、RAG、Agent、微调等关键技术,结合架构演进与实战技巧,助你构建高性能AI系统,建议点赞收藏。
341 0
|
关系型数据库 MySQL Apache
怎么在树莓派上搭建WordPress博客网站,并发布到外网可访问?
怎么在树莓派上搭建WordPress博客网站,并发布到外网可访问?
690 1
|
安全 Linux 网络安全
Vivado 2017.04版本安装教程
Vivado 2017.04版本安装教程
1248 0
webpack优化篇(四十):速度分析:使用 speed-measure-webpack-plugin
webpack优化篇(四十):速度分析:使用 speed-measure-webpack-plugin
2114 0
webpack优化篇(四十):速度分析:使用 speed-measure-webpack-plugin
|
7月前
|
人工智能 自然语言处理 运维
新员工培训全攻略:从战略解码到实战落地的深度拆解
当航天科工七〇六所通过InfoQ的“线上+线下混合式培训”将200名新员工的岗位胜任周期缩短40%,当某芯片巨头用“铸造成长·一苇可航”主题培训将企业文化转化率达78%,我们不得不思考:在AI重构生产关系的今天,如何让培训计划既承载战略意图,又点燃个体价值?
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
11月前
|
监控 数据可视化 项目管理
关键链项目管理是什么?它如何优化传统项目管理?
关键链项目管理(CCPM)由艾利·高德拉特提出,通过优化资源分配和减少多任务并行的浪费,显著提高项目执行效率与成功率。本文介绍CCPM的核心理念、与传统项目管理的区别及优势,并推荐几款支持CCPM的项目管理软件,如ProChain、板栗看板等,帮助企业更好地实施这一高效管理方法。
502 0
|
Ubuntu Linux 开发工具
idea使用git提交代码报异常refusing to merge unrelated histories和unknown option `allow-unrelated-histories‘
idea使用git提交代码报异常refusing to merge unrelated histories和unknown option `allow-unrelated-histories‘
|
SQL DataWorks 安全
DataWorks产品使用合集之怎么注释代码块
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
330 0
|
存储 Java 分布式数据库
什么是HBase?它的特点是什么?
什么是HBase?它的特点是什么?
942 0