大厂面试真题详解:电话号码的字母组合

简介: 大厂面试真题详解:电话号码的字母组合

给一个不包含0和1的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。
下图的手机按键图,就表示了每个数字可以代表的字母。

image.png

  • 以上的答案是按照词典编撰顺序进行输出的,不过,在做本题时,你也可以任意选择你喜欢的输出顺序。

在线评测地址:领扣题库官网

样例 1:

输入: "23"
输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

解释:
'2' 可以是 'a', 'b' 或 'c'
'3' 可以是 'd', 'e' 或 'f'
样例 2:

输入: "5"
输出: ["j", "k", "l"]

算法:DFS

  1. 如果输入的数字串为空,返回空列表;
  2. 预处理存储1-9各个数字可以对应的字母;
  3. 对数字串进行深度优先搜索,传入的参数包括:数字串digits、当前的位置index、当前存入的字符串current、保存答案的字符串列表result、数字字母映射的字符串数组phone;
  • 当前位置达到数字串末尾即达到边界,将current添加到result,回溯;
  • 对index位置的数字通过phone找出可以选用的每个字母,分别递归调用dfs;
  • 递归步进为:index+1, current+选用的字母;

复杂度分析

  • 时间复杂度:O(4^n), n为数字串长度

    • 每个数字都有3-4个可对应的字母
  • 空间复杂度:O(4^n),n为数字串长度

    • 对于用来保存答案的列表,最多有4^n种组合
    public class Solution {
        /**
         * @param digits: A digital string
         * @return: all posible letter combinations
         */
    
        public static final HashMap<Integer, String> PHONE = new HashMap<Integer, String>() {
            {
                put(0, ""); put(1, ""); 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 digits) {
            List<String> result = new ArrayList<>();
            if (digits.length() == 0) {
                return result;
            }
            dfs(0, "", digits, PHONE, result);
            return result;
        }
    
        private void dfs(int index, String current, String digits, HashMap<Integer, String> PHONE, List<String> result) {
            if (index == digits.length()) {
                result.add(current);
                return;
            }
    
            int d = digits.charAt(index) - '0';
            for (char c : PHONE.get(d).toCharArray()) {
                dfs(index + 1, current + c, digits, PHONE, result);
            }
        }
    }

更多题解参考:九章官网solution

相关文章
|
4月前
|
存储 索引
面试题 17.05. 字母与数字(前缀和)
面试题 17.05. 字母与数字(前缀和)
|
6月前
【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表
【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表
38 0
|
算法 C++ Python
每日算法系列【LeetCode 面试题 17.05】字母与数字
每日算法系列【LeetCode 面试题 17.05】字母与数字
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
303 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
202 0
|
设计模式 缓存 算法
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件
|
算法 索引
【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]
了解[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]。
169 0
【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]
|
消息中间件 NoSQL 网络协议
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
应广大读者要求,今天开更一些大厂的面经和相关的面试干货,下面这份**最新字节跳动春招面经+笔记**带给大家。
151 0
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
|
NoSQL 算法 Dubbo