这题是典型的递归,不过用迭代也可以做。
迭代的思路是,
第一层for每次读入一个digits里的数字,解析成String,比如从1得到"abc"。
第二层for,依次读取结果集result里面已有的array们。
第三层for,依次读取"abc"里面的"a""b""c",跟第二层里面的结果集里的一一匹配。
最后,更新结果集。
public ArrayList<String> letterCombinations(String digits) {
ArrayList<String> result = new ArrayList<>();
if(digits.length()==0) return result;
result.add("");
int digitLen = digits.length();
for(int i = 0 ; i < digitLen ; i ++){
String letter = getLetters(digits.charAt(i));
ArrayList<String> newResult = new ArrayList<>();
for(int j = 0 ; j < result.size() ; j++ ){
for(int k = 0 ; k < letter.length() ; k ++){
newResult.add(result.get(j) + letter.charAt(k));
}
}
result = newResult;
}
return result;
}
private String getLetters(char digit) {
switch (digit) {
case '2':
return "abc";
case '3':
return "def";
case '4':
return "ghi";
case '5':
return "jkl";
case '6':
return "mno";
case '7':
return "pqrs";
case '8':
return "tuv";
case '9':
return "wxyz";
case '0':
return "";
default:
return "";
}
}
递归的思路:
https://segmentfault.com/a/1190000003766442
public class Solution {
String[] table = {" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
// 建立映射表
ArrayList<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
dfs(result, sb, digits, 0);
return result;
}
public void dfs(ArrayList<String> result, StringBuilder sb, String digits, int tableIndex) {
if (tableIndex == digits.length()) {
result.add(sb.toString());
return;
}
//digits: "23"
//注意这一句,tableIndex每次递归后增加;而for中i增加的是当前letter的index,也就是说输入"12"会以ad,ae,af..顺序打印
String letter = table[digits.charAt(tableIndex) - '0'];
//letter.length() not digits.length()
for (int i = 0; i < letter.length(); i++) {
sb.append(letter.charAt(i));
dfs(result, sb, digits, tableIndex + 1);
//永远是len-1
sb.deleteCharAt(sb.length() - 1);
}
}
public static void main(String args[]) {
Solution solution = new Solution();
System.out.println(solution.letterCombinations("23"));
}
}