day28 回溯

2023-10-27

  • 93.复原IP地址
    • 本质上是分割问题
    • 判断一个分割的值是否有效
    • 回溯需要去掉 '.'
  • 78.子集
    • ​​​​​​​收集每个树的节点
  • 90.子集II
    • ​​​​​​​收集每个树的节点 + 树层去重
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description: TODO
 * @date 2023/5/2 09:11
 *
 * 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
 * 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
 * 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/restore-ip-addresses
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class LeetCode93 {
    List<String> result = new ArrayList<>();

    public List<String> restoreIpAddresses(String s) {
        helper(s, 0, 0);
        return result;
    }

    public void helper(String s, int startIdx, int pointNum){
        //递归截止条件
        if(pointNum == 3){
            //判断第四段是否合法
            if(isValid(s, startIdx, s.length() - 1)){
                result.add(s);
            }

            return;
        }

        for(int i = startIdx;i < s.length();i++){
            if(isValid(s, startIdx, i)){
                //给当前的str打点
                s = s.substring(0, i + 1) + "." + s.substring(i + 1);
                pointNum++;
                /**
                 * 此时 '.'已经占了一位 递归从i + 2开始 都是细节
                 */
                helper(s, i + 2, pointNum);
                pointNum--;
                //回溯 去除 '.';
                s = s.substring(0, i + 1) + s.substring(i + 2);
            }else{
                //continue? 不满足条件 直接break
                break;
            }
        }
    }

    /**
     * 判断ip地址是否合法
     * 1. 0开头不合法
     * 2. 非数字字符不合法
     * 3. 大于255不合法
     */
    private boolean isValid(String s, int start, int end) {
        int sum = 0;
        if(start > end){
            return false;
        }

        //判断首位为0
        if(s.charAt(start) == '0' && start != end){
            return false;
        }

        for(int i = start;i <= end;i++){
            if(s.charAt(i) < '0' || s.charAt(i) > '9'){
                return false;
            }

            sum = 10 * sum + (s.charAt(i) - '0');
            if(sum > 255){
                return false;
            }
        }

        return true;
    }

    public static void main(String[] args) {
        LeetCode93 demo = new LeetCode93();
        demo.restoreIpAddresses("25525511135");
    }
}
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description: 子集
 * @date 2023/5/2 10:17
 *
 * 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
 *
 * 说明:解集不能包含重复的子集。
 * 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   [2],   [1,2,3],   [1,3],   [2,3],   [1,2],   [] ]
 *
 * 不能包含重复子集:
 * 抽象成树 -> 寻找树的全部节点
 */
public class LeetCode78 {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> sub = new LinkedList<>();

    public List<List<Integer>> subsets(int[] nums) {
        if(null == nums || nums.length == 0){
            return res;
        }

        helper(nums, 0);
        return res;
    }

    public void helper(int[] nums, int startIdx){
        if(startIdx > nums.length){
            return;
        }


        res.add(new ArrayList<>(sub));

        for(int i = startIdx;i < nums.length;i++){
            sub.add(nums[i]);
            helper(nums, i + 1);
            sub.removeLast();
        }
    }
}
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description: LeetCode90_子集2
 * @date 2023/5/2 10:57
 *
 * 比LeetCode78多一个树层去重
 */
public class LeetCode90 {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> sub = new LinkedList<>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        if(null == nums || nums.length == 0){
            return res;
        }

        Arrays.sort(nums);
        boolean[] used = new boolean[nums.length];
        helper(nums, 0, used);
        return res;
    }

    public void helper(int[] nums, int startIdx, boolean[] used){
        if(startIdx > nums.length){
            return;
        }

        res.add(new ArrayList<>(sub));

        for(int i = startIdx;i < nums.length;i++){
            //树层去重
            if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){
                continue;
            }

            used[i] = true;
            sub.add(nums[i]);
            helper(nums, i + 1, used);
            sub.removeLast();
            used[i] = false;
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day28 回溯 的相关文章

随机推荐

  • 怎么使用maven?

    文章目录 Maven环境搭建 创建maven项目 添加依赖 插件 添加依赖 javax servlet api 和 javax servlet jsp api 添加maven插件 运行项目 使用命令行方式运行项目 使用本地tomcat运行m
  • 【神经网络深度学习】--语义分割 Unet

    Unet 发表于 2015 年 属于 FCN 的一种变体 Unet 的初衷是为了解决生物医学图像的问题 由于效果确实很好后来也被广泛的应用在语义分割的各个方向 如卫星图像分割 工业瑕疵检测等 Unet 跟 FCN 都是 Encoder De
  • 两个无序的数组合并为一个有序的数组

    这道题很有意思 考察对于排序思想的理解 我相信大部分的人都写过两个有序链表的合并 不过前提是有序 这里是无序的 其次是链表合并指向变化 不许要开辟额外的空间就可以去做 这里不可以 因此是数组 你可以思考一下充满了挑战性 那么这道题该如何处理
  • STL之deque源码

    stl deque h 如果vector能满足你的需求 那么就使用vector 如果不得不使用deque 那么在进行一算法 尤其是sort 操作时 应该先把deque中的元素复制到vector中 执行完算法再复制回去 这样的效率往往要高于直
  • LA@0线性方程组的解摘要@记号说明

    文章目录 摘要 方程编号说明 摘要 n元线性方程组是包含n个未知量的线性方程组 它的解是一个n维向量 称为线性方程组的解向量 简称解 当线性方程组的解不唯一时 同一个 线性方程组的解向量之间具有一定关系 下面我们主要以线性方程组的向量方程形
  • 【数据分析】Pandas处理excel--导入+保存xlsx

    首先安装好pandas pip命令安装 本节案例数据表lesson4 xlsx Section 1 导入数据 用的pandas的read x 方法 x表示待导入文件的格式 导入 xlsx文件 使用read excel 文件路径 filePa
  • [渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法

    这是最近学习渗透和网站攻防的文章 希望能深入地学习这部分知识 自己作为一个初学者 前一篇文章从数据库原理解读了防止SQL注入 这篇文章通过SQLMAP工具简单介绍SQL注入及用法 自己仍在慢慢探索网络攻防和渗透 希望文章对你有所帮助 尤其是
  • 九十二.字符串算法问题(一)

    题一 判断字符串中有无重复字符 实现一个算法 确定一个字符串的所有字符是否全都不同 import java util Scanner public class LianXi public static boolean checkdiffer
  • virt-manager创建虚机需要指定的设置

    如果使用默认设置 鼠标键盘都不能用 也不能通过宿主机访问外网 所以在创建的时候 需要 好了 等到安装完毕 鼠标键盘在vnc中都能正常使用 也可以上网了
  • MATLAB读写.wav和.raw音频文件

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 wav文件格式 二 matlab代码 1 fread读 wav文件 2 fread读 raw音频文件 3 wav转raw 3 raw转wav 5 更改音频
  • String,StringBuffer,StringBuilder三者之间的联系和区别

    一 String 和 StringBuffer StringBuilder 相同点 String StringBuffer StringBuilder都是可以用来存储字符串的 不同点 1 String存储的字符串是不可变的 StringBu
  • 编译原理课设-设计一个词法分析器

    设计课设时时间紧凑 难免有些错误 文末还有完整的word可以直接下载使用 也可以直接私信我发你 文章目录 摘要 二 设计内容 一 目的 二 整体框架 三 设计类 四 项目技术 1 守卫锁lock guard C 11 2 正则表达式 C 1
  • MVC 服务端Api接口的开发

    总结上一个项目的服务器API开发的流程 附带源码下载 实现效果 存储客户端上传的订单数据到数据表 并展示到前端界面 共分为两个模块 此模块主要显示服务端如何存储数据 如何发送数据到前端界面 前后端建立的都是MVC项目 使用DTO模式传输数据
  • windows多用户远程登录工具 RDPWrap配置

    目录 准备 配置 完 准备 下载 在https github com stascorp rdpwrap releases tag v1 6 2下载RDPWrap v1 6 2 zip 下载后解压 配置 install bat右键管理员运行
  • (未解决)selenium.common.exceptions.NoSuchWindowException: Message: no such window

    执行代码如下 from selenium import webdriver from time import sleep if name main driver webdriver Chrome driver implicitly wait
  • 【1day】​万户协同办公平台 ezoffice未授权访问漏洞学习

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录
  • vue3中hooks的介绍及用法

    大家好 今天这篇文章是介绍一下vue3中的hooks以及它的用法 本文内容主要有以下两点 什么是hooks vue3中hooks的使用方法 一 什么是hooks hook是钩子的意思 看到 钩子 是不是就想到了钩子函数 事实上 hooks
  • 告别了夸克,我已经找到了比你更强大的浏览器

    老实说 夸克真的是一款非常不错的浏览器 但是随着更新这个app越来越臃肿 还搞起了付费网盘 很多人转身选择其他浏览器 以前也给大家推荐过Alook浏览器 X浏览器等 今天 再给大家推荐3款浏览器 比夸克更牛 更好用 不信就往下看吧 1 多御
  • 【论文精读】360MVSNet

    今天读的是发表在WACV2023上的MVS文章 该文章提出了基于全景相机的MVS pipeline 文章链接 点击前往 代码链接 暂未开源 文章目录 Abstract 1 Introduction 2 Related works 3 Met
  • day28 回溯

    93 复原IP地址 本质上是分割问题 判断一个分割的值是否有效 回溯需要去掉 78 子集 收集每个树的节点 90 子集II 收集每个树的节点 树层去重 package algor trainingcamp import java util