【LeetCode】17. 电话号码的字母组合(回溯)
题目链接
17. 电话号码的字母组合
题目描述
![](https://img2020.cnblogs.com/blog/1179840/202008/1179840-20200826105200348-1230859924.png)
解题思路
又是一题经典的回溯,连续2天LC题目都是利用回溯进行解决。
![](https://img2020.cnblogs.com/blog/1179840/202008/1179840-20200826110329846-1950955007.png)
- 与
打印字符串全部子序列
、Leetcode491递增子序列
不同的是,本题需要利用一个hashmap去记录各个数字与字符串的映射关系。 - 还需要注意的一个点是:如果题目给出“234”,那输出的字母组合的长度必须等于“234”.length(),也就是不能输出“ad",必须输出”adg"长度为3的字符串,所以递归的条件需要变化。
AC代码
class Solution {
Map<Character,String> mp = new HashMap<>();
List<String> ans = new LinkedList<>();
StringBuffer sb = new StringBuffer();
void dfs(int len,String digits,Map<Character,String> mp){
//递归的出口是len==digits.length(),len可以理解为深度。
//因为我们需要的答案正是当len==digits.length()完成的,所以我们必须先把答案添加到ans动态数组中才可以结束本次递归。
if(sb.length()==digits.length()) ans.add(sb.toString());
if(len == digits.length()) return;
//因为每一层都有多个选择,所以需要一个for循环,
//如果是二叉树的话,就只有一个节点,所以不需要for循环直接递归即可
for(int i = 0; i < mp.get(digits.charAt(len)).length(); i++){
sb.append(mp.get(digits.charAt(len)).charAt(i));
dfs(len+1,digits,mp);
sb.deleteCharAt(sb.length()-1);//这句话最能体现出回溯的思想!
}
}
public List<String> letterCombinations(String digits) {
mp.put('2',"abc");
mp.put('3',"def");
mp.put('4',"ghi");
mp.put('5',"jkl");
mp.put('6',"mno");
mp.put('7',"pqrs");
mp.put('8',"tuv");
mp.put('9',"wxyz");
if(digits.length() == 0) return ans;
dfs(0,digits,mp);
return ans;
}
}