public List<String> letterCombinations(String digits) {
LinkedList<String> queue = new LinkedList<String>();
if(digits == null || digits.length() == 0) return queue;
queue.add("");
String[] letters = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
for(int i = 0; i < digits.length(); i++){
int cur = digits.charAt(i) - '0';
while(queue.peek().length() == i){
String str = queue.remove();
char[] candidates = letters[cur].toCharArray();
for(char chr : candidates){
queue.add(str + chr);
}
}
}
return queue;
}
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<String>();
if(digits == null || digits.length() == 0) return list;
String[] letters = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
dfs(list, new StringBuilder(), digits, letters, 0);
return list;
}
private void dfs(List<String> list, StringBuilder sb, String digits, String[] letters, int pos){
if(sb.length() == digits.length()){
list.add(sb.toString());
return;
}
for(int i = pos; i < digits.length(); i++){
String str = letters[digits.charAt(i) - '0'];
for(int j = 0; j < str.length(); j++){
int length = sb.length();
sb.append(str.charAt(j));
dfs(list, sb, digits, letters, i + 1);
sb.setLength(length);
}
}
}