来源:力扣(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 }