如果在leetCode写出的代码很长,多半是不对劲......
class Solution {
ArrayList<Integer> oneResult = new ArrayList<>();
ArrayList<List<Integer>> results = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
if (n > 45) {
return new ArrayList();
}
combinationSum3(k, n, 1, 0);
return results;
}
private void combinationSum3(int k, int n, int startNum, int sum) {
if (sum > n || oneResult.size() > k) {
return;
}
if (sum == n && oneResult.size() == k) {
results.add(new ArrayList(oneResult));
return;
}
for (int i = startNum; i <= 9; i++) {
sum += i;
oneResult.add(i);
combinationSum3(k, n, i + 1, sum);
sum -= i;
oneResult.remove(oneResult.size() - 1);
}
}
}
class Solution {
int oneResultLength;
char[] oneResult;
Set<String> results = new HashSet<>();
HashMap<Character,Character> letter2DigitMap = new HashMap<>();
char[] digitsChar;
public List<String> letterCombinations(String digits) {
if(digits.length() == 0){
return new ArrayList();
}
HashMap<Character,Character[]> digits2LetterMap = intDigits2LetterMap();
letter2DigitMap = intLetter2DigitsMap();
this.oneResultLength = digits.length();
this.oneResult = new char[oneResultLength];
this.digitsChar = digits.toCharArray();
int allLetterSize = 0;
for(int i=0;i<digitsChar.length;i++){
allLetterSize += digits2LetterMap.get(digitsChar[i]).length;
}
char[] allLetter = new char[allLetterSize];
int index=0;
for(int i=0;i<digitsChar.length;i++){
Character[] characters = digits2LetterMap.get(digitsChar[i]);
for(int j=0;j<characters.length;j++){
allLetter[index++] = characters[j];
}
}
doLetterCombinations(allLetter,0,0);
return new ArrayList(results);
}
private HashMap<Character,Character[]> intDigits2LetterMap(){
HashMap<Character,Character[]> digit2LetterMap = new HashMap<>();
digit2LetterMap.put('2',new Character[]{'a','b','c'});
digit2LetterMap.put('3',new Character[]{'d','e','f'});
digit2LetterMap.put('4',new Character[]{'g','h','i'});
digit2LetterMap.put('5',new Character[]{'j','k','l'});
digit2LetterMap.put('6',new Character[]{'m','n','o'});
digit2LetterMap.put('7',new Character[]{'p','q','r','s'});
digit2LetterMap.put('8',new Character[]{'t','u','v'});
digit2LetterMap.put('9',new Character[]{'w','x','y','z'});
return digit2LetterMap;
}
private HashMap<Character,Character> intLetter2DigitsMap(){
letter2DigitMap.put('a','2');
letter2DigitMap.put('b','2');
letter2DigitMap.put('c','2');
letter2DigitMap.put('d','3');
letter2DigitMap.put('e','3');
letter2DigitMap.put('f','3');
letter2DigitMap.put('g','4');
letter2DigitMap.put('h','4');
letter2DigitMap.put('i','4');
letter2DigitMap.put('j','5');
letter2DigitMap.put('k','5');
letter2DigitMap.put('l','5');
letter2DigitMap.put('m','6');
letter2DigitMap.put('n','6');
letter2DigitMap.put('o','6');
letter2DigitMap.put('p','7');
letter2DigitMap.put('q','7');
letter2DigitMap.put('r','7');
letter2DigitMap.put('s','7');
letter2DigitMap.put('t','8');
letter2DigitMap.put('u','8');
letter2DigitMap.put('v','8');
letter2DigitMap.put('w','9');
letter2DigitMap.put('x','9');
letter2DigitMap.put('y','9');
letter2DigitMap.put('z','9');
return letter2DigitMap;
}
private void doLetterCombinations(char[] allLetter,int allLetterStartPos,int oneResultCurPos){
for(int i=0;i<oneResultCurPos;i++){
if(letter2DigitMap.get(oneResult[i]) != digitsChar[i]){
return;
}
}
if(oneResultCurPos >= oneResultLength){
results.add(new String(oneResult));
return;
}
for(int i=allLetterStartPos;i<allLetter.length;i++){
//选择当前节点
oneResult[oneResultCurPos] = allLetter[i];
//在选择当前节点的继续上,继续处理剩余节点
doLetterCombinations(allLetter,i+1,++oneResultCurPos);
//不选择当前节点
oneResultCurPos--;
}
}
}