激动人心啊,终于能以这种操作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;
}
}