0


回溯算法习题其一-Java【力扣】【算法学习day.15】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!

习题

1.分割回文串

**题目链接:**131. 分割回文串 - 力扣(LeetCode)

题面:

**基本分析:**回溯暴力

代码:

  1. class Solution {
  2. int len;
  3. List<List<String>> list = new ArrayList<>();
  4. public List<List<String>> partition(String s) {
  5. len=s.length();
  6. List<String> stack = new ArrayList<>();
  7. recursion(s,0,stack);
  8. return list;
  9. }
  10. public void recursion(String s,int l,List<String> stack){
  11. if(l==len){
  12. list.add(new ArrayList<>(stack));
  13. return;
  14. }
  15. for(int i = l;i<=len-1;i++){
  16. String sub = s.substring(l,i+1);
  17. StringBuilder sb = new StringBuilder();
  18. sb.append(sub);
  19. if(sub.equals(sb.reverse().toString())){
  20. stack.add(sub);
  21. recursion(s,i+1,stack);
  22. stack.remove(stack.size()-1);
  23. }
  24. }
  25. }
  26. }

2.复位IP地址

**题目链接:**93. 复原 IP 地址 - 力扣(LeetCode)

题面:

**基本分析:**回溯暴力,就是在上一题的基础上判断复杂了点

代码:

  1. class Solution {
  2. List<String> list = new ArrayList<>();
  3. int len;
  4. public List<String> restoreIpAddresses(String s) {
  5. len = s.length()-1;
  6. recursion(s,0,"",1);
  7. return list;
  8. }
  9. public void recursion(String s,int l,String ans,int u){
  10. if(u==4){
  11. // System.out.println(1);
  12. String sub = s.substring(l,len+1);
  13. if(isLegal(sub)==false)return;
  14. ans+=sub;
  15. list.add(new String(ans));
  16. return;
  17. }
  18. for(int i = l;i<=len;i++){
  19. String sub = s.substring(l,i+1);
  20. // System.out.println(sub);
  21. if(isLegal(sub)==false)return;
  22. // System.out.println(1);
  23. int prilen = ans.length();
  24. ans=ans+sub+".";
  25. recursion(s,i+1,ans,u+1);
  26. ans=ans.substring(0,prilen);
  27. }
  28. }
  29. public boolean isLegal(String str){
  30. if(str.equals(""))return false;
  31. if(str.length()>3||(str.length()>=2&&str.startsWith("0")))return false;
  32. int sum = 0;
  33. for (char c : str.toCharArray()) {
  34. sum=sum*10+(c-'0');
  35. }
  36. // System.out.println(sum);
  37. if(sum>255)return false;
  38. return true;
  39. }
  40. }

3.子集

**题目链接:**78. 子集 - 力扣(LeetCode)

题面:

基本分析:回溯暴力

代码:

  1. class Solution {
  2. Set<List<Integer>> list = new HashSet<>();
  3. int len;
  4. public List<List<Integer>> subsets(int[] nums) {
  5. List<Integer> stack = new ArrayList<>();
  6. len = nums.length-1;
  7. list.add(new ArrayList<>(stack));
  8. recursion(nums,0,stack);
  9. return new ArrayList<>(list);
  10. }
  11. public void recursion(int[] nums,int l,List<Integer> stack){
  12. if(l==len+1){
  13. return;
  14. }
  15. for(int i = l;i<=len;i++){
  16. stack.add(nums[i]);
  17. list.add(new ArrayList<>(stack));
  18. recursion(nums,i+1,stack);
  19. stack.remove(stack.size()-1);
  20. }
  21. }
  22. }

4.子集II

**题目链接:**90. 子集 II - 力扣(LeetCode)

题面:

**基本分析:**在上一题的基础上加了重复的处理,可以通过先对数组排序解决

代码:

  1. class Solution {
  2. Set<List<Integer>> list = new HashSet<>();
  3. int len;
  4. public List<List<Integer>> subsetsWithDup(int[] nums) {
  5. List<Integer> stack = new ArrayList<>();
  6. Arrays.sort(nums);
  7. len = nums.length-1;
  8. list.add(new ArrayList<>(stack));
  9. recursion(nums,0,stack);
  10. return new ArrayList<>(list);
  11. }
  12. public void recursion(int[] nums,int l,List<Integer> stack){
  13. if(l==len+1){
  14. return;
  15. }
  16. for(int i = l;i<=len;i++){
  17. stack.add(nums[i]);
  18. // System.out.println(new ArrayList<>(stack));
  19. list.add(new ArrayList<>(stack));
  20. recursion(nums,i+1,stack);
  21. stack.remove(stack.size()-1);
  22. if(i+1<=len&&nums[i+1]==nums[i])return;
  23. }
  24. }
  25. }

后言

上面是回溯算法的基本概念和部分习题,下一篇会讲解回溯算法的其他相关力扣习题,希望有所帮助,一同进步,共勉!

标签: leetcode 学习 算法

本文转载自: https://blog.csdn.net/2301_79232523/article/details/143272704
版权归原作者 南宫生 所有, 如有侵权,请联系我们删除。

“回溯算法习题其一-Java【力扣】【算法学习day.15】”的评论:

还没有评论