这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
leetcode 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
解题: 由题目可得每个数字对应有3-4个字母,对于输入的字符串数字,每种组合都得包含每个数字对应的其中一个字母,就是字符串数字有多长,那组合的字母就得多长,并且不重复的,那就可以利用递归的回溯操作,遍历数字字符串的每一个数字获取其对应的字母,将其看成一个树形结构的组合,第一个数字为头节点,然后其对应的字母为子节点,然后字母下面的节点又对应第二个数字,第二个数字下面的子节点又方便对应其字母,以此类推。每次找到其中一条分支一直往下到底为一种组合,然后在回到上一个节点,找另外一个分支,如此反反复复查询完所有分支就获得所有组合。例如对于“23”先获取第一个数字对应的字母字符串abc,1.获取字符串第一个字母a,保存好字符串str,2.接着获取下一个字母字符串def,获取该字符串第一个字母d,保存好字符串str变成ad,3.然后后面还有数字就继续这样操作,否则就记录下当前字符串str为一个组合,然后去掉最后获取的字母d,4..接着获取e、f。第二个字符串结束后在回到1第一个字符串获取b。
“23”树形:
2
a b c
3 3 3
d e f d e f d e f
class Solution {
public List<String> letterCombinations(String digits) {
List<String> combinations = new ArrayList<>();
if (digits.length()==0){
return combinations;
}
letterCombinations(combinations, new StringBuilder(), digits, 0);
return combinations;
}
private void letterCombinations(List<String> combinations, StringBuilder str, String digits, int index) {
// 数字取到头了
if (index == digits.length()) {
combinations.add(str.toString());
return;
}
// 每次取出一个数字
char c = digits.charAt(index);
// 取出数字对应的字母
String letter = getLetter(c);
int letterLen = letter.length();
// 遍历当前数字字母,在取得下一个数字的字母拼接
for (int i = 0; i < letterLen; i++) {
// 接上当前的字母
str.append(letter.charAt(i));
// 如果后面还有字母就把 后面的也这样接上
letterCombinations(combinations, str, digits, index + 1);
// 把后面的去掉,重新接其他字母
str.deleteCharAt(index);
}
}
private String getLetter(char c) {
switch (c) {
case '2':
return "abc";
case '3':
return "def";
case '4':
return "ghi";
case '5':
return "jkl";
case '6':
return "mno";
case '7':
return "pqrs";
case '8':
return "tuv";
case '9':
return "wxyz";
default:
return "";
}
}
}