• LeetCode 热题100 17. *的字母组合


    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number


    分割线:这道题我一开始的思路想到了用hashmap来做数字和字母的对应,但是没有想到具体如何来做。看了题解后,对于用队列的方式来做这种思路我比较容易理解,但是奈何代码能力太差了,只能暂时搁置。题解看懂了不代表你会写了,等下次有空再补上代码吧,先把解析写在下面方便理解。


    题目:

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

     解析:

    首先通过hashmap将每个数字对应的字母存储起来

    然后使用队列,每次选一个数字,将其和队列里面已有的几个字母依次拼接,然后再次存储在队列中

    直到所有的数字都被选择完,队列里面的元素就是最终结果

    代码:(注意第32行统计的队列长度,这个变量需要放在for循环外面,如果放在里面的话,因为不断的出队入队,这样会陷入死循环,最终超时)

     1 class Solution {
     2     public List<String> letterCombinations(String digits) {
     3         List<String> res = new ArrayList<>(); //用来返回最终的结果
     4         HashMap<Character,String[]> map = new HashMap<Character,String[]>(){{
     5             put('2',new String[]{"a","b","c"});
     6             put('3',new String[]{"d","e","f"});
     7             put('4',new String[]{"g","h","i"});
     8             put('5',new String[]{"j","k","l"});
     9             put('6',new String[]{"m","n","o"});
    10             put('7',new String[]{"p","q","r","s"});
    11             put('8',new String[]{"t","u","v"});
    12             put('9',new String[]{"w","x","y","z"});
    13         }};
    14 
    15         Queue<String> queue = new LinkedList<>(); //用来存储每一次拼接后的元素
    16 
    17         for(int i=0;i<digits.length();++i){
    18             Pinjie(queue,map.get(digits.charAt(i)));
    19         }
    20         for(String str:queue){ //将最终队列的元素存储到List<String>中返回
    21             res.add(str);
    22         }
    23 
    24         return res;
    25     }
    26 
    27     public Queue<String> Pinjie(Queue<String> queue, String[] letters){ //每次将队列和需要拼接的数字对应的字母作为参数传过来
    28         if(queue.size()==0){ //初始队列是空的,那么直接将第一个数字的字母全部压入队列
    29             for(String str:letters) queue.add(str);
    30         }
    31         else{ //如果队列不为空,先记录需要进行出队的次数(即,传过来的队列中一开始有几个元素,这些元素需要和传过来的数字对应的字母一一拼接)
    32         int Queue_lenth = queue.size(); //这个一定要在外面统计好,如果放到for循环里面,会死循环
    33             for(int i=0;i<Queue_lenth;++i){
    34                 String s=queue.poll();  //每次将队首的元素出队
    35                 for(String str:letters){
    36                     queue.add(s + str); //进行拼接后继续压入队列
    37                 }
    38             }
    39         }
    40         return queue;
    41     }
    42 }
  • 相关阅读:
    Java线程状态及Thread类中的主要方法
    Kali Linux 装好系统后安装经常使用软件
    Setup SSH and SVN on Windows Server
    sql plus 抢救数据(測)
    利用用户自己的server、tomcat下的解决iOS7.1企业应用无法安装应用程序 由于证书无效的问题
    mysql基本操作【重要】
    Mybatis逆向工程——(十四)
    lucene查询索引之QueryParser解析查询——(八)
    lucene查询索引之Query子类查询——(七)
    lucene修改索引——(六)
  • 原文地址:https://www.cnblogs.com/laysfq/p/16413158.html
Copyright © 2020-2023  润新知