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

后言

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

相关推荐
yyy(十一月限定版)1 分钟前
ACM&OJ最终选拔赛
算法
YaBingSec2 分钟前
玄机靶场—Apache-druid(CVE-2021-25646) WP
java·开发语言·笔记·安全·php·apache
叶小鸡6 分钟前
Java 篇-项目实战-天机学堂(从0到1)-day7
java·开发语言
何中应7 分钟前
记录一次Jenkins构建任务的坑
java·servlet·jenkins
嵌入式×边缘AI:打怪升级日志8 分钟前
从零开始学习 Linux SPI 驱动开发(基于 IMX6ULL + TLC5615 DAC)
linux·驱动开发·学习
啦啦啦_99998 分钟前
1. 线性回归之 导数偏导数
算法·矩阵·线性回归
踩坑记录10 分钟前
leetcode hot100 5. 最长回文子串 中心扩展法 medium
leetcode
如君愿10 分钟前
考研复习 Day 23 | 习题--计算机网络第一章、数据结构线性表
数据结构·计算机网络·考研·课后习题·记录考研
雪碧聊技术11 分钟前
上午题_计算机系统
java·开发语言
时空自由民.17 分钟前
嵌入式学习-构建系统(图形化IDE/Kconfig/手动makefile Cmake)
数据库·ide·单片机·学习