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

后言

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

相关推荐
数智化管理手记1 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
何事误红尘2 小时前
Mqtt学习笔记(一):Mosquitto服务器搭建、MQTTX安装测试
学习
半夏微凉半夏殇2 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_906565122 小时前
数学之美探究
算法
oier_Asad.Chen2 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
cfm_29142 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
青山是哪个青山2 小时前
LangChain 学习笔记(三):LangSmith 调试与监控
笔记·学习·langchain
鲸采云SRM采购管理系统3 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
那年窗外下的雪.3 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
leisoo80974 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法