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;
        }
    }
}


总结:


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

目录
相关文章
|
5天前
|
算法 测试技术 C#
【单调栈】LeetCode2030:含特定字母的最小子序列
【单调栈】LeetCode2030:含特定字母的最小子序列
|
5天前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
12 2
|
5天前
leetcode代码记录(有效的字母异位词
leetcode代码记录(有效的字母异位词
11 1
|
5天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
5天前
【力扣】1832.判断句子是否为全字母句
【力扣】1832.判断句子是否为全字母句
|
5天前
leetcode热题100. 字母异位词分组
leetcode热题100. 字母异位词分组
18 0
|
5天前
|
Java
LeetCode-电话号码的字母组合-Java
电话号码的字母组合-Java
15 0
|
5天前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
30 0
|
5天前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
32 0
|
5天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0