题目
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
Input:Digit string “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
分析
我的想法是,应用全排列的思想,将字母依次填进数组中,再转为list。
例如 abc 和de进行全排列,先创建3*2的数组。将数组填充为a a b b c c,第二轮循环将数组填充为ad ae bd be cd ce
这需要 计算出每个字符重复的间隔。
public static List<String> letterCombinations(String digits) {
List list = new LinkedList<>();
String[] aa = new String[] {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
if (digits==null || digits.length() == 0) {
return list;
}
char[] digit = digits.toCharArray();
int [] inter = new int[digit.length];
for (int i = digit.length-1; i>=0; i--) {
if (i == digit.length-1) {
inter[i] = 1;
} else {
inter[i] = inter[i+1]*aa[digit[i+1]-48].length();
}
}
int sum = inter[0] * aa[digit[0] - 48].length();
StringBuffer[] xx = new StringBuffer[sum];
for (int i = 0; i<inter.length;i++) {
int continu = (int)(inter[i]);
char[] array = aa[digit[i]-48].toCharArray();
int arrayIndex = 0;
for (int index = 0; index<sum;) {
int tmpContinue = continu;
if (arrayIndex == array.length) {
arrayIndex=0;
}
while (tmpContinue-->0) {
if (xx[index] == null) {
xx[index] = new StringBuffer("");
}
xx[index] = xx[index].append(array[arrayIndex]);
index++;
}
arrayIndex++;
}
}
for (int i = 0; i<xx.length;i++) {
list.add(xx[i].toString());
}
return list;
}
还有一种思想巨巨巨巨巧妙
只有15行代码。就是每读到一个数字把可能的string放进list里,再有下一个数字时,把list里的全部取出,加上现有后缀。再放进去。
public List<String> letterCombinations1(String digits) {
LinkedList<String> ans = new LinkedList<String>();
String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ans.add("");
for(int i =0; i<digits.length();i++){
int x = Character.getNumericValue(digits.charAt(i));
while(ans.peek().length()==i){
String t = ans.remove();
for(char s : mapping[x].toCharArray())
ans.add(t+s);
}
}
return ans;
}