17_电话号码的字母组合

难度:中等

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

示例

示例一:

输入:digits = “23”
输出:[“ad”,”ae”,”af”,”bd”,”be”,”bf”,”cd”,”ce”,”cf”]

示例二:

输入:digits = “”
输出:[]

示例三:

输入:digits = “2”
输出:[“a”,”b”,”c”]

提示

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

解题

采用 DFS 思路,在 DFS 函数中,首先判断是否遍历结束,即index == digits.length(),遍历结束即将当前字符串加入答案列表。否则获取当前字符对应的全部字母,然后遍历字母。

1
2
3
4
5
6
7
char digit = digits.charAt(index);
String letter = chars[digit-'0'-2];
for(int i=0; i<letter.length(); i++){
sb.append(letter.charAt(i));
dfs(sb,digits,index+1);
sb.deleteCharAt(index);
}

从 index = 0 的位置开始,最后返回答案列表

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
class Solution {
List<String> ans;
static String[] chars = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits){
ans = new ArrayList<>();
if (digits.length()==0) return ans;
StringBuilder sb = new StringBuilder();
dfs(sb,digits,0);
return ans;
}
public void dfs(StringBuilder sb, String digits, int index){
if (index == digits.length()){
ans.add(sb.toString());
return;
}
char digit = digits.charAt(index);
// 当前数字对应的全部字母
String letter = chars[digit-'0'-2];
int letterCount = letter.length();
for (int i = 0; i < letterCount; i++) {
// 加入当前字母
sb.append(letter.charAt(i));
// 去下个数字中搜索
dfs(sb,digits,index+1);
// 回溯,将当前字母删掉
sb.deleteCharAt(index);
}
}
}