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月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
3月前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
25 1
|
3月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
28 0
Leetcode第十七题(电话号码的字母组合)
|
3月前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
23 0
【LeetCode 11】242.有效的字母异位词
|
3月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
43 0
|
5月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
7月前
|
存储
力扣经典150题第四十二题:字母异位词分组
力扣经典150题第四十二题:字母异位词分组
43 0
|
7月前
|
存储
力扣经典150题第四十一题:有效的字母异位词
力扣经典150题第四十一题:有效的字母异位词
40 0
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
133 2