给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
解法一:
迭代求解。
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<>();
if (digits.isEmpty()) {
return list;
}
String[] strings = new String[]{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
list.add("");
//对所有数字进行遍历
for (int i = 0; i < digits.length(); i++) {
//得到对应数字的字符串
String str = strings[digits.charAt(i) - '2'];
//获取当前列表中的字符串个数
int size = list.size();
//对列表中的字符串进行遍历
for (int j = 0; j < size; j++) {
//获取列表第一个字符串
String temp = list.get(0);
//然后删除它,因为该字符串不完整,所以不是我们要的答案
list.remove(0);
//然后遍历之前获得的对应数字的字符串,逐个添加字符,然后添加进列表
for (int k = 0; k < str.length(); k++) {
list.add(temp + str.charAt(k));
}
}
}
return list;
}
解法二:
递归求解。我们需要建立一个字典,用来保存每个数字所代表的字符串,然后我们还需要一个变量 level,记录当前生成的字符串的字符个数。
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<>();
if (digits.isEmpty()) {
return list;
}
String[] strings = new String[]{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
letterCombinationsDFS(digits, strings, 0, new StringBuilder(), list);
return list;
}
public void letterCombinationsDFS(String digits, String[] strings, int level, StringBuilder out, List<String> list) {
//如果已经到达最后一层,则把字符串添加进列表
if (level == digits.length()) {
list.add(out.toString());
} else {
//获取对应数字的字符串
String str = strings[digits.charAt(level) - '2'];
for (int i = 0; i < str.length(); i++) {
out.append(str.charAt(i));
//添加完这一层的一个字符之后,继续添加下一层的字符
letterCombinationsDFS(digits, strings, level + 1, out, list);
//注意要回退字符串
out.deleteCharAt(out.length() - 1);
}
}
}
本题思路参考自 [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合