【CT】LeetCode手撕—93. 复原 IP 地址

news/2024/7/8 4:53:18 标签: leetcode, 算法

目录

  • 题目
  • 1- 思路
  • 2- 实现
    • ⭐93. 复原 IP 地址——题解思路
  • 3- ACM 实现


题目

  • 原题连接:93. 复原 IP 地址

1- 思路

模式识别:给一个 String 字符串 ——> 复原 IP 地址 ——> 回溯三部曲 ,回溯的切割问题 ——> 实现一个左闭右闭区间的 isValid 实现
回溯三部曲

  • 1. 定义回溯参数及返回值
    • public void backTracing(String s ,int startIndex,int pointSum)
    • startIndex :代表切割线
    • pointSum :代表 逗点数量
  • 2. 回溯终止条件
    • 用一个全局变量 count 来计算逗号的数量,当逗号的数量达到 3 则此时终止
  • 3. 回溯逻辑
    • for 中 i 从 startIndex 开始,遍历到 s.length()

IP地址合法性判断

    1. 不能以 0 开头
    1. 遍历判断不能是非法字符
    1. 求和不能大于 255

2- 实现

⭐93. 复原 IP 地址——题解思路

在这里插入图片描述

class Solution {
    public List<String> restoreIpAddresses(String s) {
        backTracing(s,0,0);
        return res;
    }


    // 回溯
    List<String> res = new ArrayList<>();
    public void backTracing(String s, int startIndex,int pointSum){

        //2. 终止条件
        if(pointSum==3){
            if(isValid(s,startIndex,s.length()-1)){
                res.add(s);
            }
            return;
        }

        //3. 遍历回溯逻辑
        for(int i = startIndex;i<s.length();i++){
            if(isValid(s,startIndex,i)){
                s = s.substring(0,i+1)+"."+s.substring(i+1);
                pointSum++;
                backTracing(s,i+2,pointSum);
                pointSum--;
                s = s.substring(0,i+1)+s.substring(i+2);
            }else{
                break;
            }
        }
    }

    public Boolean isValid(String s,int start,int end){
        if(start>end){
            return false;
        }
        if(start!=end && s.charAt(start)=='0'){
            return false;
        }
        // 遍历判断,字符合法 ,是否超过 255
        int sum = 0;
        for(int i = start;i <= end;i++){
            if(s.charAt(i) >'9' || s.charAt(i) <'0'){
                return false;
            }
            sum = sum*10 + (s.charAt(i)-'0');
            if(sum>255){
                return false;
            }
        }
        return true;
    }
}

3- ACM 实现

public class remakeIP {


    static List<String> res = new ArrayList<>();
    public static List<String> splitIP(String s){
        backTracing(s,0,0);
        return res;
    }

    // 回溯参数及返回值
    public static void backTracing(String s,int startIndex,int pointSum){
        // 2. 终止条件
        if(pointSum==3){
            if(isValid(s,startIndex,s.length()-1)){
                res.add(s);
            }
            return ;
        }

        //3. 回溯
        for(int i = startIndex; i < s.length();i++){
            if(isValid(s,startIndex,i)){
                s = s.substring(0,i+1) + "."+s.substring(i+1);
                pointSum++;
                backTracing(s,i+2,pointSum);
                s = s.substring(0,i+1)+s.substring(i+2);
                pointSum--;
            }else{
                break;
            }
        }
    }


    public static boolean isValid(String s ,int start,int end){
        if(start>end){
            return false;
        }
        // 判断前置 0
        if(start!=end && s.charAt(start)=='0'){
            return false;
        }
        // 遍历判断 非法字符 和 255
        int sum = 0;
        for(int i = start; i <= end;i++){
            if(s.charAt(i)>'9' || s.charAt(i)<'0'){
                return false;
            }
            sum = sum*10+(s.charAt(i)-'0');
            if(sum>255) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println("输入字符串s");
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        splitIP(input);
        for(String s : res){
            System.out.println(s+" ");
        }
    }
}



http://www.niftyadmin.cn/n/5536536.html

相关文章

富格林:曝光有效方案安全交易

富格林认为&#xff0c;近些年来大家的投资理财意识逐渐增强&#xff0c;现货黄金作为一种自带优质避险功能的投资产品&#xff0c;自然就受到投资者的关注和追捧。但现货黄金的交易市场相对来说还是比较混杂&#xff0c;投资小白稍不留神就可能会陷入受害陷阱当中无法安全交易…

k8s-第六节-数据持久化

数据持久化 kubernetes 集群不会为你处理数据的存储,需要为数据库挂载一个磁盘来确保数据的安全。 可以选择云存储、本地磁盘、NFS。 本地磁盘:可以挂载某个节点上的目录,但是这需要限定 pod 在这个节点上运行 云存储:不限定节点,不受集群影响,安全稳定;需要云服务商提…

Eclipse 2024最新版本分享

一、软件介绍 Eclipse是一个开源的、基于Java的可扩展开发平台&#xff0c;最初由IBM公司开发&#xff0c;后于2001年贡献给开源社区&#xff0c;并由Eclipse基金会负责管理和开发。 如果在官网上下载比较慢&#xff0c;可以试试从云盘中下载&#xff0c;解压即可使用。 二、下…

Vector的扩容过程是怎样的

Vector的扩容过程在C中是一个动态调整内存空间以容纳更多元素的过程。这一过程主要发生在向Vector中添加元素时&#xff0c;如果当前Vector的容量不足以容纳新元素&#xff0c;就会触发扩容操作。以下是Vector扩容过程的详细步骤&#xff1a; 扩容机制 判断是否需要扩容&…

k8s常见组件之Kube-apiserver

Kube-apiserver Kube-apiserver 是 Kubernetes 集群中非常重要的一个核心组件,它担任以下关键角色: API 服务 Kube-apiserver 提供了 Kubernetes API 的入口,供集群内外的各种客户端(如 kubectl、控制平面组件等)访问和操作资源对象。它实现了 RESTful 风格的 API 接口,支持…

SpringMVC启动流程

文章目录 引文HandlerHandlerMapperHandlerAdapterRequestMapping方法参数解析RequestMapping方法返回值解析文件上传流程拦截器解析 SpringMVC启动流程如下 引文 我们在使用SpringMVC时&#xff0c;传统的方式是在webapp目录下定义一个web.xml文件&#xff0c;比如&#xff1a…

【论文通读】GUICourse: From General Vision Language Model to Versatile GUI Agent

GUICourse: From General Vision Language Model to Versatile GUI Agent 前言AbstractMotivationSolutionGUICourseGUIEnvGUIEnv-globalGUIEnv-local GUIActGUIAct (web-single)GUIAct (web-multi)GUIAct (smartphone) GUIChat ExperimentsMain ResultAblation Study Conclusi…

使用Python绘制堆积柱形图

使用Python绘制堆积柱形图 堆积柱形图效果代码 堆积柱形图 堆积柱形图&#xff08;Stacked Bar Chart&#xff09;是一种数据可视化图表&#xff0c;用于显示不同类别的数值在某一变量上的累积情况。每一个柱状条显示多个子类别的数值&#xff0c;子类别的数值在柱状条上堆积在…