[leetcode]17. Letter Combinations of a Phone Number
阿新 • • 發佈:2018-12-01
激動人心啊,終於能以這種操作ac了
第一遍submit忘記處理空,第二遍就ac了
Runtime: 2 ms, faster than 91.37% of Java online submissions for Letter Combinations of a Phone Number.
Solution 1: Divide and Conquer
-
要記住啊!分治法要分到最小的問題再開始合。這個題的最小規模問題就是處理一個數字。
被註釋掉的部分是因為我邏輯錯了,怎麼會想到分到兩個就開始合呢 -
一開始的divide和merge函式都是用的List< String > 作為返回值,後來發現list的取值和迭代非常的麻煩。遂換成string[]進行處理。最後將結果整個轉化成List< String > 。這樣更為方便吧。
class Solution { public List<String> letterCombinations(String digits) { Map<Character,String> hashmap=new HashMap<>(); List<String> finallist=new ArrayList<String>(); if(digits==null||digits.length()==0) return finallist; hashmap.put('2',"abc"); hashmap.put('3',"def"); hashmap.put('4',"ghi"); hashmap.put('5',"jkl"); hashmap.put('6',"mno"); hashmap.put('7',"pqrs"); hashmap.put('8',"tuv"); hashmap.put('9',"wxyz"); char[] dig=digits.toCharArray(); int left=0; int right=dig.length-1; String[] res=Divide(digits,hashmap,left,right); for(int i=0;i<res.length;i++){ finallist.add(res[i]); } return finallist; } private String[] Divide(String digits,Map<Character,String> hashmap,int left, int right){ // if(left+1==right){ // String str1=hashmap.get(digits.charAt(left)); // String str2=hashmap.get(digits.charAt(right)); // String[] list=new String[str1.length()*str2.length()]; // int k=0; // for(int i=0;i<str1.length();i++){ // String ss=""; // for(int j=0;j<str2.length();j++){ // ss+=str1.charAt(i); // ss+=str2.charAt(j); // list[k]=ss; // k++; // } // } // return list; // } if(left==right){ String str1=hashmap.get(digits.charAt(left)); String[] list=new String[str1.length()]; int k=0; for(int i=0;i<str1.length();i++){ list[k]=str1.substring(i,i+1); k++; } return list; } int mid=(left+right)/2; String[] listLeft=Divide(digits,hashmap,left,mid); String[] listRight=Divide(digits,hashmap,mid+1,right); return mergeList(listLeft,listRight); } private String[] mergeList(String[] listLeft,String[] listRight){ String[] reslist=new String[listLeft.length*listRight.length]; int k=0; for(int i=0;i<listLeft.length;i++){ for(int j=0;j<listRight.length;j++){ String mergeString=""; mergeString+=listLeft[i]; mergeString+=listRight[j]; reslist[k]=mergeString; k++; } } return reslist; } }