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

前言

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

习题

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;
        }
    }
}

后言

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

相关推荐
齐 飞3 分钟前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色19 分钟前
多AS互联BGP4综合实验设计
java
某不知名網友39 分钟前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog1 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程1 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn1 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
用户3721574261351 小时前
Java 读取、修改和清空 PDF 文档属性(元数据)
java
SL_staff1 小时前
从‘改一行代码等三天’到‘改完即生效’:实施工程师的逻辑引擎避坑手记
java·产品·全栈
小羊没烦恼!1 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
hhwyqwqhhwy1 小时前
设备树之 provider 和 consumer
java·linux·前端