C/C++教程

LeetCode 热题100 17. 电话号码的字母组合

本文主要是介绍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 }

 

这篇关于LeetCode 热题100 17. 电话号码的字母组合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!