题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
解题方法
dfs遍历
这是一道经典的dfs遍历题目。我们将数字和字母的对应关系存起来,可以存为字符串数组,数组索引代表数字,内容代表这个数字能表示的所有字符,索引0和1的位置存的是空字符串。接下来,我们对给出的数字字符串进行dfs遍历。由于比较简单,就不再大篇幅描述,具体实现可以参考以下代码。
java代码
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<>();
if (digits.length() == 0) {
return list;
}
String[] str = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
StringBuilder bd = new StringBuilder();
letterCore(bd, str, list, digits, 0);
return list;
}
// dfs遍历。bd存储组合的字符串;str为字母数组,对应索引为数字;list是结果集;digits是数字字符串;i为遍历深度,代表遍历到的第i个字符。
public void letterCore(StringBuilder bd, String[] str, List<String> list, String digits, int i) {
// 当遍历深度与数字字符串长度相等时,list添加组合字符串,dfs遍历结束
if (i == digits.length()) {
list.add(bd.toString());
return;
}
int num = digits.charAt(i) - '0';
int length = str[num].length();
int index = 0;
while (index < length) {
bd.append(str[num].charAt(index));
letterCore(bd, str, list, digits, i + 1);
bd.deleteCharAt(bd.length() - 1);
index++;
}
}
由于digits长度最长为4,每个数字可以代表的字母最多为4个(7和9分别可以代表4个字母),所以dfs遍历的次数最多为44=256。dfs的遍历深度最高为4,并不会栈溢出。
相似题目
[leetcode] 10. 正则表达式匹配
[leetcode] 22. 括号生成
- 个人公众号
- 个人小游戏