题目
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
1
2
2
示例 2:
输入:digits = ""
输出:[]
1
2
2
示例 3:
输入:digits = "2"
输出:["a","b","c"]
1
2
2
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
题解
java
/**
* 数字与字母对照表
*/
private static final String[][] DIGITS = new String[][]{
{},
{},
{"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> result = new ArrayList<>();
int length = digits.length();
BiConsumer<Integer, String> recursion = new BiConsumer<Integer, String>() {
@Override
public void accept(Integer integer, String s) {
// 已经到了最后一个字符
if (integer == length) {
result.add(s);
return;
}
// 对照表索引
int index = Integer.valueOf(String.valueOf(digits.charAt(integer)));
for (String letter : DIGITS[index]) {
// 递归拼接字符串
this.accept(integer + 1, s + letter);
}
}
};
// 排除空字符串
if (digits.length() > 0) {
recursion.accept(0, "");
}
return result;
}
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45