代码随想录回溯算法03

news2025/4/9 7:18:57

93.复原IP地址

本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了

题目链接/文章讲解:代码随想录

视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili

有效 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 中的任何数字。你可以按 任何 顺序返回答案。

class Solution {
    List<String>res=new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        StringBuilder st=new StringBuilder(s);//将s转化为可以增删的字符串
        back(st,0,0);
        return res;
    }
      public  void back(StringBuilder s,int index,int num)
      {
        if(num==3&&isvalid(s,index,s.length()-1))
        {
            res.add(s.toString());
            return;
        }
        for(int i=index;i<s.length();i++)
        {
            if(isvalid(s,index,i)){//实际上已经是一个剪枝的操作,若此段不符合要求,则后续回溯操作不必进行
         s.insert(i+1,'.');//添加点的步骤
         back(s,i+2,num+1);//back(StringBuilder s,int index,int num),index更新为i+2,表示从剩余的元素(索引为index+2)中开始选切割
         s.deleteCharAt(i+1);//删去i+1索引的这个点,便于选择另外一个方向
        }
        else
        {
            break;
        }
      }}
//[start,end]为左闭右闭,为每一个分割开的字符,适用于StringBuilder
    public boolean isvalid(StringBuilder s,int start,int end)
    {
        if(start>end)
        {
            return false;
        }
    String seg=s.substring(start,end+1);//左闭右开
    if(seg.length()>3)
    {
        return false;
    }
    int num=Integer.parseInt(seg);
    if(num>255||num<0)
    {
        return false;
    }
    //前导0
    if(seg.charAt(0)=='0'&&seg.length()>1)
    {
        return false;
    }
    return true;

    }
}

注意点:

问题说明
"9245587303"长度太长,不可能是合法 IP 段(超过 255)
Integer.parseInt()只能处理合法 int 范围(-2,147,483,648 到 2,147,483,647)
.substring(start, end+1)如果不加长度限制,可能会生成很长子串导致异常

在使用Integer.parseInt()之前,为避免长度太长,应该提前筛去length>3的切割字符串

insert()StringBuilder向字符串中插入字符sb.insert(1, ".")
add()List 接口实现类向列表中添加元素list.add("192")
方法名适用类型用途
deleteCharAt(int index)StringBuilder / StringBuffer删除指定位置的字符
remove(int index)List(如 ArrayList删除集合中指定索引的元素
remove(Object o)List, Set删除集合中指定值的元素

String的方法大全

length()获取字符串长度"abc".length()3
charAt(int index)获取指定位置的字符"hello".charAt(1)'e'
substring(int begin)从索引开始截取到末尾"hello".substring(2)"llo"
substring(int begin, int end)截取部分字符串 [begin, end)"hello".substring(1, 4)"ell"
indexOf(String str)查找子串首次出现的位置"apple".indexOf("p")1
lastIndexOf(String str)查找子串最后出现位置"apple".lastIndexOf("p")2
contains(String s)是否包含子串"abc".contains("b")true
isEmpty()是否为空字符串(长度为 0)"".isEmpty()true
equals(String s)判断是否相等(区分大小写)"abc".equals("ABC")false
equalsIgnoreCase(String s)忽略大小写比较"abc".equalsIgnoreCase("ABC")true
toLowerCase() / toUpperCase()转小写 / 转大写"Hello".toLowerCase()"hello"
trim()去除首尾空格" hi ".trim()"hi"
方法用法说明
String.valueOf(任意类型)String.valueOf(123)"123"将任意值转为字符串
Integer.parseInt(String s)"123"123将字符串转为整数(注意捕获异常)
Double.parseDouble(String s)"3.14"3.14将字符串转为小数
startsWith(String prefix)"hello".startsWith("he")true是否以指定前缀开始
endsWith(String suffix)"hello".endsWith("lo")true是否以指定后缀结束
matches(String regex)"123".matches("\\d+")true是否符合正则表达式

char[] arr = "hello".toCharArray(); // 字符串 → 字符数组
String s = new String(arr);         // 字符数组 → 字符串

解法:

画出回溯的树形结构来分析,

78.子集

子集问题,就是收集树形结构中,每一个节点的结果。 整体代码其实和 回溯模板都是差不多的。

题目链接/文章讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html

视频讲解:回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili

class Solution {
    List<List<Integer>>res=new ArrayList<>();//注意接口和实现类
    LinkedList<Integer>path=new LinkedList<>();
    public List<List<Integer>> subsets(int[] nums) {
        back(nums,0);
        return res;
    }
    public void back(int []nums,int index)
   {
    res.add(new LinkedList<>(path));
    for(int i=index;i<nums.length;i++)
    {
        
        path.add(nums[i]);
        back(nums,i+1);
        path.removeLast();
    }
   }


}

空集的产生:在第一次调用 back(nums, 0) 时,path 是空的,res.add(new LinkedList<>(path)) 就把空集 [] 加入到结果中。

90.子集II

题目链接/文章讲解:代码随想录

视频讲解:回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibili

class Solution {
    List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
    LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);//去重前应该先排序
        back(nums, 0);
        return result;
    }

    private void back(int[] nums, int startIndex){
        result.add(new ArrayList<>(path));//「遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合」。
        if (startIndex >= nums.length){ //终止条件可不加
            return;
        }
        
        for (int i = startIndex; i < nums.length; i++){
           if(i>startIndex&&nums[i]==nums[i-1]){continue;}//判断i>startIndex避免出现-1
            path.add(nums[i]);
            back(nums, i + 1);
            path.removeLast();
        }
    }
}

先排序,再进行经典去重操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量改CAD图层颜色——CAD c#二次开发

一个文件夹下大量图纸&#xff08;几百甚至几千个文件&#xff09;需要改图层颜色时&#xff0c;可采用插件实现&#xff0c;效果如下&#xff1a; 转换前&#xff1a; 转换后&#xff1a; 使用方式如下&#xff1a;netload加载此dll插件&#xff0c;输入xx运行。 附部分代码如…

【内网安全】DHCP 饿死攻击和防护

正常情况&#xff1a;PC2可以正常获取到DHCP SERVER分别的IP地址查看DHCP SERCER 的ip pool地址池可以看到分配了一个地址、Total 253个 Used 1个 使用kali工具进行模拟攻击 进行DHCP DISCOVER攻击 此时查看DHCP SERVER d大量的抓包&#xff1a;大量的DHCP Discover包 此时模…

10种电阻综合对比——《器件手册--电阻》

二、电阻 前言 10种电阻对比数据表 电阻类型 原理 特点 应用 贴片电阻 贴片电阻是表面贴装元件&#xff0c;通过将电阻体直接贴在电路板上实现电路连接 体积小、重量轻&#xff0c;适合高密度电路板&#xff1b;精度高、稳定性好&#xff0c;便于自动化生产 广泛应用于…

剑指Offer(数据结构与算法面试题精讲)C++版——day6

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day6 题目一&#xff1a;不含重复字符的最长子字符串题目二&#xff1a;包含所有字符的最短字符串题目三&#xff1a;有效的回文 题目一&#xff1a;不含重复字符的最长子字符串 这里还是可以使用前面&#x…

freertos韦东山---事件组以及实验

事件组的原理是什么&#xff0c;有哪些优点&#xff0c;为啥要创造出这个概念 在实时操作系统&#xff08;如 FreeRTOS&#xff09;中&#xff0c;事件组是一种用于任务间同步和通信的机制&#xff0c;它的原理、优点及存在意义如下&#xff1a; 事件组原理 数据结构&#xf…

架构师面试(二十六):系统拆分

问题 今天我们聊电商系统实际业务场景的问题&#xff0c;考查对业务系统问题的分析能力、解决问题的能力和对系统长期发展的整体规划能力。 一电商平台在早期阶段业务发展迅速&#xff0c;DAU在 10W&#xff1b;整个电商系统按水平分层架构进行设计&#xff0c;包括【入口网关…

Java中的同步和异步

一、前言 在Java中&#xff0c;同步&#xff08;Synchronous&#xff09;和异步&#xff08;Asynchronous&#xff09;是两种不同的任务处理模式。核心区别在任务执行的顺序控制和线程阻塞行为。 二、同步&#xff08;Synchronous&#xff09; 定义&#xff1a;任务按顺序执行…

在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus

一、安装环境信息说明 硬件资源&#xff08;GB 和 GiB 的主要区别在于它们的换算基数不同&#xff0c;GB 使用十进制&#xff0c;GiB 使用二进制&#xff0c;导致相同数值下 GiB 表示的容量略大于 GB&#xff1b;换算关系&#xff1a;1 GiB ≈ 1.07374 GB &#xff1b;1 GB ≈ …

NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)

贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当&#xff0c;难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法&#xff1f; 贪⼼算法&#xff0c;或者说是贪⼼策略&#xff1a;企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步&#xff1b;解决每⼀步时…

瑞萨RA4M2使用心得-KEIL5的第一次编译

目录 前言 环境&#xff1a; 开发板&#xff1a;RA-Eco-RA4M2-100PIN-V1.0 IDE&#xff1a;keil5.35 一、软件的下载 编辑瑞萨的芯片&#xff0c;除了keil5 外还需要一个软件&#xff1a;RASC 路径&#xff1a;Releases renesas/fsp (github.com) 向下找到&#xff1a; …

数据分析-Excel-学习笔记

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格个构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can

ChatGPT 的新图像生成器非常擅长伪造收据

本月&#xff0c;ChatGPT 推出了一种新的图像生成器&#xff0c;作为其 4o 模型的一部分&#xff0c;该模型在生成图像内的文本方面做得更好。 人们已经在利用它来生成假的餐厅收据&#xff0c;这可能会为欺诈者使用的已经很广泛的 AI 深度伪造工具包添加另一种工具。 多产的…

JS页面尺寸事件

元素位置 在这里插入图片描述 父元素带有定位时输出相对于父亲元素的距离值

网络协议之基础介绍

写在前面 本文看下网络协议相关基础内容。 1&#xff1a;为什么要有网络协议 为了实现世界各地的不同主机的互联互通。 2&#xff1a;协议的三要素 协议存在的目的就是立规矩&#xff0c;无规矩不成方圆嘛&#xff01;但是这个规矩也不是想怎么立就怎么立的&#xff0c;也…

初识数据结构——Java集合框架解析:List与ArrayList的完美结合

&#x1f4da; Java集合框架解析&#xff1a;List与ArrayList的完美结合 &#x1f31f; 前言&#xff1a;为什么我们需要List和ArrayList&#xff1f; 在日常开发中&#xff0c;我们经常需要处理一组数据。想象一下&#xff0c;如果你要管理一个班级的学生名单&#xff0c;或…

uniapp微信小程序引入vant组件库

1、首先要有uniapp项目&#xff0c;根据vant官方文档使用yarn或npm安装依赖&#xff1a; 1、 yarn init 或 npm init2、 # 通过 npm 安装npm i vant/weapp -S --production# 通过 yarn 安装yarn add vant/weapp --production# 安装 0.x 版本npm i vant-weapp -S --production …

贪心进阶学习笔记

反悔贪心 贪心是指直接选择局部最优解&#xff0c;不需要考虑之后的影响。 而反悔贪心是在贪心上面加了一个“反悔”的操作&#xff0c;于是又可以撤销之前的“鲁莽行动”&#xff0c;让整个的选择稍微变得“理智一些”。 于是&#xff0c;我个人理解&#xff0c;反悔贪心是…

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

架构师面试(二十七):单链表

问题 今天的问题对于架构师来说会相对容易许多。今天出一个【数据结构与算法】相关的题目&#xff0c;醒醒脑。 给一张【单链表】&#xff0c;该单链表有100个节点元素&#xff08;当然&#xff0c;事先我们是不知道100这个数目的&#xff09;&#xff0c;要获取倒数第8个元素…