17. 电话号码的字母组合
队列法
package leetcode; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class demo_17 { public List<String> letterCombinations(String digits) { List<String> li =new ArrayList<String>(); HashMap<Character, String> hm=new HashMap<Character, String>(); Queue<String> q=new LinkedList<String>(); if(digits.equals("")) {return li;} hm.put('2', "abc"); hm.put('3',"def" ); hm.put('4',"ghi" ); hm.put('5',"jkl" ); hm.put('6',"mno" ); hm.put('7',"pqrs" ); hm.put('8',"tuv" ); hm.put('9',"wxyz" ); //现将第一个数字对应的字符串各个字符入队列 for(int j=0;j<hm.get(digits.charAt(0)).length();j++) { q.offer(String.valueOf(hm.get(digits.charAt(0)).charAt(j))); } for(int i=1;i<digits.length();i++) { String s=hm.get(digits.charAt(i)); //记录原先队列的长度,方便控制循环次数 int length=q.size(); for(int j=0;j<length;j++) { //保留当前出队的字符串 String ss=q.poll(); for(int k=0;k<s.length();k++) { q.offer(ss+s.charAt(k)); } } } for(String s:q) { li.add(s); } System.out.println(li); return li; } public static void main(String[] args) { // TODO Auto-generated method stub demo_17 d17 =new demo_17(); d17.letterCombinations("23"); } }
回溯法
https://blog.csdn.net/weiyuefei/article/details/79316653
public List<String> letterCombinations(String digits) { List<String> li =new ArrayList<String>(); if(digits.equals("")) {return li;} HashMap<Character, String> hm=new HashMap<Character, String>(); hm.put('2', "abc"); hm.put('3',"def" ); hm.put('4',"ghi" ); hm.put('5',"jkl" ); hm.put('6',"mno" ); hm.put('7',"pqrs" ); hm.put('8',"tuv" ); hm.put('9',"wxyz" ); backtrack(hm, li, 0, digits, new StringBuffer()); System.out.println(li); return li; } public void backtrack(HashMap<Character,String> hm,List<String> li,int index,String digits,StringBuffer sb) { //说明每一个数字都有一个字符被使用了 if(index==digits.length()) { li.add(sb.toString()); } else { char c=digits.charAt(index); int length=hm.get(c).length(); for(int i=0;i<length;i++) { sb.append(hm.get(c).charAt(i)); //继续向下递归,直到取完所有合理的字符 backtrack(hm, li, index+1, digits, sb); //进行回溯,删去那些已经用过的字符 sb.deleteCharAt(index); } } }
浙公网安备 33010602011771号