回溯算法习题其一-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;
        }
    }
}

后言

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

相关推荐
gAlAxy...6 分钟前
MyBatis-Plus 核心 CRUD 操作全解析:BaseMapper 与通用 Service 实战
java·开发语言·mybatis
YunchengLi9 分钟前
【计算机图形学中的四元数】2/2 Quaternions for Computer Graphics
人工智能·算法·机器学习
开开心心就好10 分钟前
一键加密隐藏视频,专属格式播放工具
java·linux·开发语言·网络·人工智能·macos
Amarantine、沐风倩✨22 分钟前
列表接口严禁嵌套 LISTAGG + REGEXP:一次 mission_label 性能事故复盘
java·数据库·sql
CUC-MenG33 分钟前
Codeforces Round 1079 (Div. 2)A,B,C,D,E1,E2,F个人题解
c语言·开发语言·数学·算法
666HZ66638 分钟前
数据结构4.0 串
c语言·数据结构·算法
m***066843 分钟前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
Anastasiozzzz1 小时前
Java异步编程:CompletableFuture从入门到底层实现
java·开发语言
xiaomin-Michael1 小时前
netty学习
java
weixin_421585011 小时前
常微分方程
算法