57.电话号码的字母组合
给定一个仅包含数字 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'] 的一个数字。
代码:
class Solution {
//构建数字到字母的映射表
public static final String[] LETTERS = {
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxyz"//9
};
public List<String> letterCombinations(String digits) {
//res用来存储所有字母组合
List<String>res = new ArrayList<>();
//如果digits为空指针或者digits字符串不为空指针,但是长度为零,直接返回res本身
if(digits == null || digits.length() == 0)return res;
//sb用来存储中间字母组合
StringBuilder sb = new StringBuilder();
//递归寻找字母组合
dfs(digits,0,sb,res);
//返回res
return res;
}
public void dfs(String digits,int idx,StringBuilder sb,List<String>res){
//如果处理完了所有数字
if(idx == digits.length()){
//向res中添加当前组合
res.add(sb.toString());
return;
}
//获取当前数字对应的字母集合
char c = digits.charAt(idx);
String s = LETTERS[c-'0'];
//遍历当前数字的每个字母
for(char temp:s.toCharArray()){
//选择当前字母
sb.append(temp);
//递归处理下一个数字
dfs(digits,idx+1,sb,res);
//回溯,撤销选择
sb.deleteCharAt(sb.length()-1);
}
}
}

浙公网安备 33010602011771号