“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
- 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
二、思路分析
- 这道题是一个
排列组合的问题,会用到回溯的思想!- 首先我们把
数字字符串分割 - 分别找到他们所对应的
字母字符串,依次进行枚举,并用StringBuilder进行拼接 - 达到数字的长度后将结果
存储起来 - 存储后,需要将StringBuilder回退,重新进行上两步
- 首先我们把
三、AC 代码:
class Solution {
//存储数字对应的字符串
Map<Character, String> phoneMap = new HashMap<>();
public List<String> letterCombinations(String digits) {
//返回的结果集合
List<String> combinations = new ArrayList<>();
//边界条件,长度为0直接返回
if(digits.length() == 0){
return combinations;
}
phoneMap.put('2', "abc");
phoneMap.put('3', "def");
phoneMap.put('4', "ghi");
phoneMap.put('5', "jkl");
phoneMap.put('6', "mno");
phoneMap.put('7', "pqrs");
phoneMap.put('8', "tuv");
phoneMap.put('9', "wxyz");
//回溯参数分别为数字字符串的长度、结果集合、map对应关系、从零开始、临时的存储
backtrack(digits, combinations, phoneMap, 0, new StringBuilder());
return combinations;
}
private void backtrack(String digits, List<String> combinations, Map<Character, String>phoneMap, int index, StringBuilder combination){
//长度相等,添加到结果集合中
if(index == digits.length()){
combinations.add(combination.toString());
return ;
}
//拿到数字
char digit = digits.charAt(index);
//取出数字对应的字母
String letter = phoneMap.get(digit);
//字母的长度
int letterLength = letter.length();
for(int i = 0; i < letterLength; i++){
//临时存储
combination.append(letter.charAt(i));
//回溯枚举
backtrack(digits,combinations,phoneMap,index + 1, combination);
//临时存储还原
combination.deleteCharAt(index);
}
}
}
四、总结:
- 好了,代码撸完,我们
总结一下:-
这道题运用了回溯的思想
-
细节,要注意
回溯方法的参数 -
回溯之后记得还原 -
回溯和递归有点相似,不太好理解,小朋友们,可以画画图,或者DEBUG一下
-