电话号码的字母组合(Letter Combinations of a Phone Number)
题干
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
(数字和英文字母的映射和手机电话相同,无图)
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
分析
该题呢,我使用的是回溯法。我们先由输入的数字组合得到相应的字符组合,然后以第一个字符组合开始向下一个字符组合递归回溯。终止条件就是当回溯到最后一个字符组合。
代码
public List<String> letterCombinations(String digits) {
List<String> strings = new ArrayList<>();
if (digits.length() == 0) {
return strings;
}
String[] dict = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
//选中的字母组合
String[] arr = new String[digits.length()];
for (int i = 0; i < digits.length(); i++) {
arr[i] = dict[digits.charAt(i) - '0' - 2];
}
int startStr = 0;//循环下标
group(arr, startStr, "",strings);
return strings;
}
private static String group(String[] arr, int startStr, String str, List<String> strings) {
char[] chars1 = arr[startStr].toCharArray();
for (int j = 0; j < chars1.length; j++) {
if (startStr == arr.length - 1) {
strings.add(str + chars1[j]);
} else {
//startStr+1:遍历下一个字符组合;str + chars1[j]:拼接当前遍历的字符
group(arr, startStr+1, str + chars1[j],strings);
}
}
return str;
}