前言
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.分割回文串
题目链接: 131. 分割回文串 - 力扣(LeetCode)
题面:
**基本分析:**回溯暴力
代码:
java
class Solution {
int len;
List<List<String>> list = new ArrayList<>();
public List<List<String>> partition(String s) {
len=s.length();
List<String> stack = new ArrayList<>();
recursion(s,0,stack);
return list;
}
public void recursion(String s,int l,List<String> stack){
if(l==len){
list.add(new ArrayList<>(stack));
return;
}
for(int i = l;i<=len-1;i++){
String sub = s.substring(l,i+1);
StringBuilder sb = new StringBuilder();
sb.append(sub);
if(sub.equals(sb.reverse().toString())){
stack.add(sub);
recursion(s,i+1,stack);
stack.remove(stack.size()-1);
}
}
}
}
2.复位IP地址
题目链接: 93. 复原 IP 地址 - 力扣(LeetCode)
题面:
**基本分析:**回溯暴力,就是在上一题的基础上判断复杂了点
代码:
java
class Solution {
List<String> list = new ArrayList<>();
int len;
public List<String> restoreIpAddresses(String s) {
len = s.length()-1;
recursion(s,0,"",1);
return list;
}
public void recursion(String s,int l,String ans,int u){
if(u==4){
// System.out.println(1);
String sub = s.substring(l,len+1);
if(isLegal(sub)==false)return;
ans+=sub;
list.add(new String(ans));
return;
}
for(int i = l;i<=len;i++){
String sub = s.substring(l,i+1);
// System.out.println(sub);
if(isLegal(sub)==false)return;
// System.out.println(1);
int prilen = ans.length();
ans=ans+sub+".";
recursion(s,i+1,ans,u+1);
ans=ans.substring(0,prilen);
}
}
public boolean isLegal(String str){
if(str.equals(""))return false;
if(str.length()>3||(str.length()>=2&&str.startsWith("0")))return false;
int sum = 0;
for (char c : str.toCharArray()) {
sum=sum*10+(c-'0');
}
// System.out.println(sum);
if(sum>255)return false;
return true;
}
}
3.子集
题目链接: 78. 子集 - 力扣(LeetCode)
题面:
**基本分析:**回溯暴力
代码:
java
class Solution {
Set<List<Integer>> list = new HashSet<>();
int len;
public List<List<Integer>> subsets(int[] nums) {
List<Integer> stack = new ArrayList<>();
len = nums.length-1;
list.add(new ArrayList<>(stack));
recursion(nums,0,stack);
return new ArrayList<>(list);
}
public void recursion(int[] nums,int l,List<Integer> stack){
if(l==len+1){
return;
}
for(int i = l;i<=len;i++){
stack.add(nums[i]);
list.add(new ArrayList<>(stack));
recursion(nums,i+1,stack);
stack.remove(stack.size()-1);
}
}
}
4.子集II
题目链接: 90. 子集 II - 力扣(LeetCode)
题面:
**基本分析:**在上一题的基础上加了重复的处理,可以通过先对数组排序解决
代码:
java
class Solution {
Set<List<Integer>> list = new HashSet<>();
int len;
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<Integer> stack = new ArrayList<>();
Arrays.sort(nums);
len = nums.length-1;
list.add(new ArrayList<>(stack));
recursion(nums,0,stack);
return new ArrayList<>(list);
}
public void recursion(int[] nums,int l,List<Integer> stack){
if(l==len+1){
return;
}
for(int i = l;i<=len;i++){
stack.add(nums[i]);
// System.out.println(new ArrayList<>(stack));
list.add(new ArrayList<>(stack));
recursion(nums,i+1,stack);
stack.remove(stack.size()-1);
if(i+1<=len&&nums[i+1]==nums[i])return;
}
}
}
后言
上面是回溯算法的基本概念和部分习题,下一篇会讲解回溯算法的其他相关力扣习题,希望有所帮助,一同进步,共勉!