大家好!我是曾续缘💥
今天是《LeetCode 热题 100》系列
发车第 57 天
回溯第 3 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给定一个仅包含数字
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']
的一个数字。
解题方法
这道题目是要求给定一个仅包含数字 '2-9' 的字符串,返回所有这些数字能表示的字母组合。题目中给出了数字和字母的映射关系,类似电话按键上的对应关系。
我们可以利用回溯算法来生成所有可能的字母组合。
- 建立数字和字母的映射关系: 首先在代码中定义了一个 Map,将每个数字与其对应的字母序列进行了映射。这样做的目的是为了方便后续根据数字获取对应的字母选项。
- 初始化结果列表和特殊情况处理: 在
letterCombinations
函数中,首先初始化了一个空的结果列表ans
。然后判断输入字符串的长度,如果长度为 0,则直接返回空列表。 - 回溯函数
backtrack
: 接着定义了一个回溯函数backtrack
,用于递归生成所有可能的字母组合,并将结果保存在ans
列表中。 - 递归出口: 在回溯函数中,首先判断当前处理的数字是否已经到达字符串末尾,如果是则将当前生成的字母组合加入到结果列表中,然后返回。
- 获取当前数字对应的字母选项: 根据当前处理的数字,从映射关系中取出对应的字母选项,例如 '2' 对应 "abc"。
- 遍历当前数字对应的字母选项: 对当前数字对应的字母选项进行遍历,将每个字母依次添加到暂存的 StringBuilder
tmp
中,然后递归处理下一个数字。 - 回溯操作: 在递归之后,需要将刚刚添加的字母从
tmp
中删除,以便尝试其他的字母组合。
Code
查看代码
java
class Solution {
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<String>();
if(digits.length() == 0){
return ans;
}
Map<Character, String> mp = Map.of(
'2', "abc",
'3', "def",
'4', "ghi",
'5', "jkl",
'6', "mno",
'7', "pqrs",
'8', "tuv",
'9', "wxyz"
);
backtrack(digits, 0, ans, mp, new StringBuilder());
return ans;
}
private void backtrack(String digits, int cur, List<String> ans, Map<Character, String> mp, StringBuilder tmp){
if(cur == digits.length()){
ans.add(tmp.toString());
return;
}
char ch = digits.charAt(cur);
String choices = mp.get(ch);
for(int i = 0; i < choices.length(); i++){
tmp.append(choices.charAt(i));
backtrack(digits, cur + 1, ans, mp, tmp);
tmp.deleteCharAt(tmp.length() - 1);
}
}
}