1.Description
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
2.Example
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]
输入:digits = "2"
输出:["a","b","c"]
3.Solution
模板题;
通过回溯来获得所有的情况。
class Test1 {
List<String> ans = new LinkedList<>(); // 保存结果
StringBuilder sb = new StringBuilder(); // 记录路径
int length; // digits 的长度,即有多少个数字
public List<String> letterCombinations(String digits) {
length = digits.length();
if (length == 0) { // 没有数字
return ans;
}
String[] words = reflection(digits); // 映射
backtrack(words, 0); // 回溯
return ans;
}
public void backtrack(String[] words, int index) {
// 到达结束条件
if (index == length) {
String path = sb.toString();
ans.add(path);
return;
}
// 字符串中的字符都要用一遍
char[] word = words[index].toCharArray();
int wordLength = word.length;
for (int i = 0; i < wordLength; i++) {
sb.append(word[i]); // 选择
backtrack(words, index + 1); // 深搜
sb.deleteCharAt(sb.length() - 1); // 撤销
}
}
// 根据 digits 构造一个对应的 string[] 数组
public String[] reflection(String digits) {
char[] temp = digits.toCharArray();
String[] words = new String[length];
for (int i = 0; i < length; i++) {
switch (temp[i]) {
case '2':
words[i] = "abc";
break;
case '3':
words[i] = "def";
break;
case '4':
words[i] = "ghi";
break;
case '5':
words[i] = "jkl";
break;
case '6':
words[i] = "mno";
break;
case '7':
words[i] = "pqrs";
break;
case '8':
words[i] = "tuv";
break;
case '9':
words[i] = "wxzy";
break;
default:
break;
}
}
return words;
}
}