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

后言

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

相关推荐
_WndProc1 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_2 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
biter00884 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
Q_19284999069 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏11 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
努力学习编程的伍大侠14 分钟前
基础排序算法
数据结构·c++·算法
XiaoLeisj42 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架