标签:String 17 队列 字母 queue put 字母组合 new 热题
来源:力扣(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 }
标签:String,17,队列,字母,queue,put,字母组合,new,热题 来源: https://www.cnblogs.com/laysfq/p/16413158.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。