leetcode:17.电话号码的字母组合

简介: 可以抽象成一个排列组合的问题,题目的意思就是说当输入"23"的时候实际上就是按了两次按键,分别是2和3,然后2对应的是abc,3对应的是def,所以我们只需递归遍历每一种结果即可解决问题。

题目描述:


给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。


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


20190328113731812.png


示例:


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


说明:


尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。


分析:


可以抽象成一个排列组合的问题,题目的意思就是说当输入"23"的时候实际上就是按了两次按键,分别是2和3,然后2对应的是abc,3对应的是def,所以我们只需递归遍历每一种结果即可解决问题。


代码如下:


class Solution {
    // 用map来映射数字和字母的对应关系
    Map<String, String> map = new HashMap<>();
    {
        map.put("2", "abc");
        map.put("3", "def");
        map.put("4", "ghi");
        map.put("5", "jkl");
        map.put("6", "mno");
        map.put("7", "pqrs");
        map.put("8", "tuv");
        map.put("9", "wxyz");
    }
    public  List<String> letterCombinations(String digits) {
      // 用来存放所有结果的集合
        List<String> list = new ArrayList<>();
        int length = digits.length();
        // 常规的先判断字符串长度,也是递归的结束条件
        if (length == 0) {
            return list;
        } else if (length == 1) {
            list.addAll(Arrays.asList(map.get(digits).split("")));
            return list;
        } else {
          // 截取字符串进行递归,就是每次都从下标1开始截取,那么最后就会先从digits的最后一位开始计算
            List<String> list1 = letterCombinations(digits.substring(1));
            // 然后取出数字,再从map中找到对应的字母
            String s1 = map.get(digits.charAt(0)+"");
            // 双层for循环用来遍历所有结果,并添加到list中
            // PS:这里也可以抽象出一个方法,然后用单层for再去递归
            for (int i = 0; i < s1.length(); i++) {
                for (String s : list1) {
                    list.add(s1.charAt(i) + s);
                }
            }
            return list;
        }
    }
}


总结:


时间复杂度…反正很复杂就对了。这类排列组合问题一般都是用递归来解决,缺点就是时间复杂度过高。

目录
相关文章
|
4天前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
4天前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
2月前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
2月前
|
存储 算法 安全
LeetCode 题目 49:字母异位词分组 5种算法实现与典型应用案例【python】
LeetCode 题目 49:字母异位词分组 5种算法实现与典型应用案例【python】
|
2月前
|
存储
力扣经典150题第四十二题:字母异位词分组
力扣经典150题第四十二题:字母异位词分组
14 0
|
2月前
|
存储
力扣经典150题第四十一题:有效的字母异位词
力扣经典150题第四十一题:有效的字母异位词
15 0
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
2月前
|
存储 算法 数据挖掘
leetcode第十七题:解密电话号码的字母组合与应用【python】
leetcode第十七题:解密电话号码的字母组合与应用【python】
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
28 6