一、题目
二、代码
回溯算法
需要解决三个问题:
路径:也就是已经做出的选择。
选择列表:也就是你当前可以做的选择。
结束条件:也就是到达决策树底层,无法再做选择的条件。
其中最关键的点就是:在递归之前做选择,在递归之后撤销选择
class Solution {
LinkedList result = new LinkedList();
Map<Character, String> letterMap = new HashMap<>();
// public void backtrack(路径,选择列表){
// if(满足结束条件){
// result.add(结果);
// }
// for(选择:选择列表){
// 做出选择;
// backtrack(路径,选择列表);
// 撤销选择;
// }
// }
public List<String> letterCombinations(String digits) {
if(digits.equals("")){
return result;
}
List<Character> visited = new LinkedList<>();
letterMap.put('2',"abc");
letterMap.put('3',"def");
letterMap.put('4',"ghi");
letterMap.put('5',"jkl");
letterMap.put('6',"mno");
letterMap.put('7',"pqrs");
letterMap.put('8',"tuv");
letterMap.put('9',"wxyz");
int index = 0;//数字字符串的第0个位置
backTrack(visited, digits, index);
return result;
}
//路径,选择列表
private void backTrack(List<Character> visited, String digits, int index){
// if(满足结束条件){
// result.add(结果);
// }
// for(选择:选择列表){
// 做出选择;
// backtrack(路径,选择列表);
// 撤销选择;
// }
// 触发结束条件(已经访问过了最后一个数字)
if (index == digits.length()) {
String str = "";
for (char item : visited) {
str += item;
}
result.add(str);
return;
}
// int index = 0;//设置局部变量在递归过程中没有作用
char currNum = digits.charAt(index);
String currLetters = letterMap.get(currNum);
for (int i = 0; i < currLetters.length(); i++) {
// currLetters字符串里面的每一个字符都是一个可选条件,不受上一个数字影响(要和全排列问题区分)
char oneLetter = currLetters.charAt(i);
visited.add(oneLetter);
backTrack(visited, digits, index + 1);//千万不要写成index++
visited.remove(visited.size() - 1);
}
}
}