JAVA
方法一
要求数字对应的全部字母的组合,直接递归就可以了,不过效率不够高,大概排在中间的位置,要考虑优化。而且在写代码的时候,对substring,list的应用不熟,记不清关键字的拼写。。尴尬。。
public class Solution {
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<String>();
if(digits.length() == 0){
return result;
}
getString(digits,"",result);
return result;
}
public void getString(String digits,String tempResult,List<String> result){
if(digits.length() == 0){
result.add(tempResult);
return;
}
Character c = digits.charAt(0);
switch(c){
// case '0':
// getString(digits.substring(1,digits.length()),tempResult + " ",result);
// break;
case '2':
getString(digits.substring(1,digits.length()),tempResult + "a",result);
getString(digits.substring(1,digits.length()),tempResult + "b",result);
getString(digits.substring(1,digits.length()),tempResult + "c",result);
break;
case '3':
getString(digits.substring(1,digits.length()),tempResult + "d",result);
getString(digits.substring(1,digits.length()),tempResult + "e",result);
getString(digits.substring(1,digits.length()),tempResult + "f",result);
break;
case '4':
getString(digits.substring(1,digits.length()),tempResult + "g",result);
getString(digits.substring(1,digits.length()),tempResult + "h",result);
getString(digits.substring(1,digits.length()),tempResult + "i",result);
break;
case '5':
getString(digits.substring(1,digits.length()),tempResult + "j",result);
getString(digits.substring(1,digits.length()),tempResult + "k",result);
getString(digits.substring(1,digits.length()),tempResult + "l",result);
break;
case '6':
getString(digits.substring(1,digits.length()),tempResult + "m",result);
getString(digits.substring(1,digits.length()),tempResult + "n",result);
getString(digits.substring(1,digits.length()),tempResult + "o",result);
break;
case '7':
getString(digits.substring(1,digits.length()),tempResult + "p",result);
getString(digits.substring(1,digits.length()),tempResult + "q",result);
getString(digits.substring(1,digits.length()),tempResult + "r",result);
getString(digits.substring(1,digits.length()),tempResult + "s",result);
break;
case '8':
getString(digits.substring(1,digits.length()),tempResult + "t",result);
getString(digits.substring(1,digits.length()),tempResult + "u",result);
getString(digits.substring(1,digits.length()),tempResult + "v",result);
break;
case '9':
getString(digits.substring(1,digits.length()),tempResult + "w",result);
getString(digits.substring(1,digits.length()),tempResult + "x",result);
getString(digits.substring(1,digits.length()),tempResult + "y",result);
getString(digits.substring(1,digits.length()),tempResult + "z",result);
break;
}
}
}
方法二
考虑用栈配合循环来代替递归,觉得这样可以快一些。
使用一个字符数组来模拟栈,为了减少时间,不手工初始化数组,直接使用默认初始化的值。
然而。。用时4ms,beats 47.1%。。。。印象中把递归转换成栈会节约很多时间的呀。。
public class Solution {
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<String>();
if(digits.length() == 0){
return result;
}
char [] temp = new char[digits.length()];
int index = 0;
while(index >= 0){
if(index == digits.length()){
result.add(new String(temp));
--index;
}
switch (digits.charAt(index)){
case '2':
switch(temp[index]){
case 0: temp[index] = 'a';++index;break;
case 'a': temp[index] = 'b';++index;break;
case 'b': temp[index] = 'c';++index;break;
case 'c': temp[index] = 0;--index;break;
}
break;
case '3':
switch(temp[index]){
case 0: temp[index] = 'd';++index;break;
case 'd': temp[index] = 'e';++index;break;
case 'e': temp[index] = 'f';++index;break;
case 'f': temp[index] = 0;--index;break;
}
break;
case '4':
switch(temp[index]){
case 0: temp[index] = 'g';++index;break;
case 'g': temp[index] = 'h';++index;break;
case 'h': temp[index] = 'i';++index;break;
case 'i': temp[index] = 0;--index;break;
}
break;
case '5':
switch(temp[index]){
case 0: temp[index] = 'j';++index;break;
case 'j': temp[index] = 'k';++index;break;
case 'k': temp[index] = 'l';++index;break;
case 'l': temp[index] = 0;--index;break;
}
break;
case '6':
switch(temp[index]){
case 0: temp[index] = 'm';++index;break;
case 'm': temp[index] = 'n';++index;break;
case 'n': temp[index] = 'o';++index;break;
case 'o': temp[index] = 0;--index;break;
}
break;
case '7':
switch(temp[index]){
case 0: temp[index] = 'p';++index;break;
case 'p': temp[index] = 'q';++index;break;
case 'q': temp[index] = 'r';++index;break;
case 'r': temp[index] = 's';++index;break;
case 's': temp[index] = 0;--index;break;
}
break;
case '8':
switch(temp[index]){
case 0: temp[index] = 't';++index;break;
case 't': temp[index] = 'u';++index;break;
case 'u': temp[index] = 'v';++index;break;
case 'v': temp[index] = 0;--index;break;
}
break;
case '9':
switch(temp[index]){
case 0: temp[index] = 'w';++index;break;
case 'w': temp[index] = 'x';++index;break;
case 'x': temp[index] = 'y';++index;break;
case 'y': temp[index] = 'z';++index;break;
case 'z': temp[index] = 0;--index;break;
}
break;
}
}
return result;
}
}