九宫格输入法的字母组合
Wallace Xu 2020-09-19 回溯
# LeetCode 17. 电话号码的字母组合 (opens new window)
# 题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射与电话按键相同。注意 1 不对应任何字母。
# 示例
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
1
2
2
# 解题思路
输入几位数字那么对应的字母组合就有多少位。那么就是说对于每个数字都有若干种选择,对于每一位我们都有该数字对应的若干种选择,那么只要使用简单的回溯就可以了,在所有位置都被填充了字母后添加到结果集中,递归中每一步都是在选择该位置上的字符。
public class No17_LetterCombinationsOfAPhoneNumber {
private List<String> result = null;
private final char[][] maps = new char[][]{{'_'}, {'!', '@', '#'}, {'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) {
result = new ArrayList<>();
if (digits == null || digits.length() == 0) return result;
StringBuilder sb = new StringBuilder();
backtrack(digits, 0, sb);
return result;
}
private void backtrack(String digits, int index, StringBuilder stringBuilder) {
//递归终止,添加到结果集
if (index == digits.length()) {
result.add(stringBuilder.toString());
return;
}
for (char map : maps[digits.charAt(index) - '0']) {
//做选择
stringBuilder.append(map);
backtrack(digits, index + 1, stringBuilder);
//撤销选择
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29