17. Letter Combinations of a Phone Number
本题目采用了分治法,从中间切开后分别计算两边的所有可能组合。最后将两边的结果进行组合
注意:Map那里是双大括号
class Solution {
Map<String, String> map = new HashMap<String, String>() {
{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}
};
List<String> combine(String digits, int left, int right){
List<String> resList = new ArrayList<String>();
if(digits.length() == 0) return resList;
if(left == right) {
String string = map.get(digits.substring(left, left+1));
for(int i = 0; i < string.length(); i ++) {
resList.add(string.substring(i, i+1));
}
return resList;
}
int m = (left + right)/2;
List<String> list1 = combine(digits, left, m);
List<String> list2 = combine(digits, m+1, right);
// O(n)
for(int i = 0; i < list1.size(); i ++) {
for(int j = 0; j < list2.size(); j ++) {
resList.add(list1.get(i) + list2.get(j));
}
}
return resList;
}
public List<String> letterCombinations(String digits) {
List<String> reStrings= new ArrayList<String>();
reStrings = combine(digits, 0, digits.length()-1);
return reStrings;
}
}