回溯
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。
便于解决树形问题的情况,比如选择子序列的问题,寻找路径等
当出现重复情况或不满足条件的时候退出
模板
public void backTrace(int start, int[] nums, List<Integer> temp){
base case 条件处理
//选择过程
for(循环选择){
选择
backTrace(递归);
撤销选择
}
}
例题: leetcode-17
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
题解:
public List<String> letterCombinations(String digits) {
List<String> list =new ArrayList<>();
String[] PhoneKey={
" ",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxyz",//9
};
findCombination(digits,0,"",list,PhoneKey);
//查看元素
System.out.print("[ ");
for (String s:list)
System.out.print(s+",");
System.out.println(" ]");
return list;
}
//根据对应的字符顺序取到相对应的值
void findCombination(String digits,int index,String str, List<String> list, String[] PhoneKey){
//递归进行判断
//当某一次已经是末尾
if(index==digits.length()){
list.add(str);
return;
}
int c=digits.charAt(index)-'0';//拿到某一位的值,char转int
if (c>=0&&c<=9&&c!=1){
String newStr=PhoneKey[c];
for (int i = 0; i < newStr.length(); i++)
findCombination(digits,index+1,str+newStr.substring(i,i+1),list,PhoneKey);
}
}