Medium
思路
- 找所有的可能性,想到DFS
- 画出recursion tree
- 几层level
- 每个level的意义
- 两个level,分别代表2和3
- 时间复杂度 = O(branch factor ^ depth) < O(4^n)
- 空间复杂度 = DFS call了多少次 -> O(n)
过程
- 定义Map,把数字和字母的对应关系放进去
- 定义StringBuilder用来存贮结果,每加一个sb后面就续一位,最后用sb.toString()变回String
- dfs过程
- Base case: 任务只有一个: 确定触底条件, 调整结果,而后向上层返回
- base case : index等于给的数字长度, 说明触底, 结果sb添加新字符
- sub - question : 确定数字,找到对应map里的value
- for循环value String里的每个字符,每加完一个字符后,就进行下一次dfs并更改index状态。因为每个level我们只能添加一个字符
- 记得recover
- 在DFS递归中传递加减不要用++, ——
代码
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<>();
map.put('1', "");
map.put('2', "abc");
map.put('3', "def");
map.put('4', "ghi");
map.put('5', "jkl");
map.put('6', "mno");
map.put('7', "pqrs");
map.put('8', "tuv");
map.put('9', "wxyz");
map.put('0', "");
StringBuilder sb = new StringBuilder();
dfs(digits, map, 0, sb, res);
return res;
}
private void dfs(String digits, Map<Character, String> map, int index, StringBuilder sb, List<String> res){
if(index == digits.length()){
res.add(sb.toString());
return;
}
char ch = digits.charAt(index);
System.out.print(ch);
String str = map.get(ch);
System.out.print(str);
for(char c : str.toCharArray()){
sb.append(c);
dfs(digits, map, index + 1, sb, res);
sb.deleteCharAt(sb.length() - 1);
}
}
}