这题没什么算法,就是锻炼编程能力,是很好的一个题目。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LetterCombinationsofaPhoneNumber {
public static void main(String[] args) {
LetterCombinationsofaPhoneNumber s = new LetterCombinationsofaPhoneNumber();
ArrayList<String> ss = s.letterCombinations("23");
System.out.println(ss);
}
private static Map<Character, List<Character>> LETTER_MAP = new HashMap<Character, List<Character>>();
static {
char d = '2';
List<Character> list = new ArrayList<Character>();
int k = 1;
for (char c = 'a'; c <= 'o'; c++) {
list.add(c);
if (k % 3 == 0) {
LETTER_MAP.put(d, list);
d++;
list = new ArrayList<Character>();
}
k++;
}
list = new ArrayList<Character>();
list.add('p');
list.add('q');
list.add('r');
list.add('s');
LETTER_MAP.put('7', list);
list = new ArrayList<Character>();
list.add('t');
list.add('u');
list.add('v');
LETTER_MAP.put('8', list);
list = new ArrayList<Character>();
list.add('w');
list.add('x');
list.add('y');
list.add('z');
LETTER_MAP.put('9', list);
}
public ArrayList<String> letterCombinations(String digits) {
ArrayList<String> result = new ArrayList<String>();
if (digits.length() == 0) {
result.add("");
return result;
}
char[] sb = new char[digits.length()];
int[] startPos = new int[digits.length()];
Arrays.fill(startPos, 0);
int i = 0;
while (i >= 0) {
char c = digits.charAt(i);
List<Character> list = LETTER_MAP.get(c);
int pos = startPos[i];
if (pos == list.size()) {
startPos[i] = 0;
i--;
} else {
sb[i] = list.get(pos);
if (i == digits.length() - 1) {
String s = String.valueOf(sb);
result.add(s);
startPos[i]++;
} else {
startPos[i]++;
i++;
}
}
}
return result;
}
}