难度中等1876收藏分享切换为英文接收动态反馈
给定一个仅包含数字 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 List<String> letterCombinations(String digits) {
//定义一个返回的结果集
List<String> res = new ArrayList<>();
//如果字符串为空,直接返回
if(digits.length() == 0){
return res;
}
//定义一个集合表示字符串的所有可能
Map<Character,String> map = new HashMap<>(){{
put('2',"abc");
put('3',"def");
put('4',"ghi");
put('5',"jkl");
put('6',"mno");
put('7',"pqrs");
put('8',"tuv");
put('9',"wxyz");
}};
//定义一个存储路径的可变字符的变量
StringBuilder path = new StringBuilder();
//递归
dfs(path,map,digits,0,res);
return res;
}
public void dfs(StringBuilder path,Map<Character,String> map, String digits,int dept,List<String> res){
//当递归到底层的时候,将路径上的参数加入结果集中
if(dept == digits.length()){
res.add(path.toString());
}else{
//定义一个存储字符串的数字
char digit = digits.charAt(dept);
//定义一个存储数字对应的所有可能字符串
String str = map.get(digit);
//定义一个表示字符串长度
int len = str.length();
//遍历字符串
for(int i = 0; i< len; i++){
//将字符添加进路径结果中
path.append(str.charAt(i));
//递归
dfs(path, map,digits,dept+1,res);
//剪枝
path.deleteCharAt(path.length()-1);
}
}
}
}
class Solution {
// 数字到号码的映射
private String[] map = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
// 路径
private StringBuilder sb = new StringBuilder();
// 结果集
private List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0) return res;
backtrack(digits,0);
return res;
}
// 回溯函数
private void backtrack(String digits,int index) {
if(sb.length() == digits.length()) {
res.add(sb.toString());
return;
}
String val = map[digits.charAt(index)-'2'];
for(char ch:val.toCharArray()) {
sb.append(ch);
backtrack(digits,index+1);
sb.deleteCharAt(sb.length()-1);
}
}
}