给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
做法:最简单的递归和动态规划,公式在代码里
class Solution {
// 字母表
String [][]keyword = {{"a", "b", "c"}, {"d", "e", "f"}, {"g", "h", "i"}, {"j", "k", "l"}
, {"m", "n", "o"}, {"p", "q", "r", "s"}, {"t", "u", "v"}, {"w", "x", "y", "z"}};
public List<String> letterCombinations(String digits) {
List<String> numbers = new ArrayList<String>();
if(digits.length() == 0){
return numbers;
}else if(digits.length() == 1){
int current_num = digits.charAt(0) - '0' - 2;
return Arrays.asList(keyword[current_num]);
}else{
int current_num = digits.charAt(0) - '0' - 2;
// 采用递归的做法
// 1.f(a->n) = f(a)*f(a+1->n)
// 2.f(n) = nums(n)
List<String> pre = letterCombinations(digits.substring(1));
for(int i=0; i<keyword[current_num].length; i++){
for(int j=0; j<pre.size(); j++){
numbers.add(keyword[current_num][i] + pre.get(j));
}
}
return numbers;
}
}
}