LeetCode17-电话号码的字母组合

题目链接

英文链接:https://leetcode.com/problems/letter-combinations-of-a-phone-number/

中文链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

题目详述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

img

示例:

1
2
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

题目详解

每次在原有结果的基础上尝试添加一个新字母。可以运用回溯的方法,也可以直接迭代。

回溯:

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
public class LeetCode_00017 {

public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return res;
}
String[] dict = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
dfs(new StringBuilder(), digits, res, dict);
return res;
}

private void dfs(StringBuilder prefix, String digits, List<String> res, String[] dict) {
if (prefix.length() == digits.length()) {
res.add(prefix.toString());
return;
}
int index = digits.charAt(prefix.length()) - '2';
for (char c : dict[index].toCharArray()) {
// 添加
prefix.append(c);
dfs(prefix, digits, res, dict);
// 删除
prefix.deleteCharAt(prefix.length() - 1);
}
}
}

迭代:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class LeetCode_00017 {

public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return res;
}
res.add("");
String[] dict = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
for (char c : digits.toCharArray()) {
String s = dict[c - '2'];
List<String> tmp = new ArrayList<>();
for (String prefix : res) {
for (char cur : s.toCharArray()) {
tmp.add(prefix + cur);
}
}
res = tmp;
}
return res;
}
}