• 力扣:复原 IP 地址java


    力扣:复原 IP 地址java

    在这里插入图片描述

    流程:

    设置一个list的结果集result
    回溯三部曲
    返回值和参数:返回值为空,参数为字符串s、开始下标startindex和已经打点数量pointsum
    结束条件:打点数量为3时结束并判断剩余字符串是否合法,合法则输出至结果集,否则直接返回上一层
    单层递归逻辑
    for循环(i=startindex;i 循环内判断当前范围[startindex,i]是否为合法地址,不合法直接break,(为什么不用continue?)
    合法则在i后打上一个点(s=s.substring(0,i+1)+“.”+s.substring(i+1,s.length());)
    对打点数量加一,
    在对其后面的字符串分割(调用递归函数参数为s,i+2,pointsum)(为什么此处为i+2?
    回溯:将打的点删除并pointsum减一

    上面的问题:

    1.为什么不用continue?
    此题来说,如果当前分割的不合法则后面再怎么分割也不合法,可以分为以下几种情况1.当前分割范围内字符串首字符为0,那就是再向后移动分割也无法合法2.含非法字符,则和上面相同3.超过255,再移动则会更大,绝对超过255,综上所述,不使用continue直接使用break。
    2.为什么此处为i+2?
    因为上面再i的后面加了个点,所以之前的i+1就变成的i+2

    代码:

    class Solution {
        List result = new ArrayList<>();//结果集
        public List restoreIpAddresses(String s) {//主函数
           fuyuanIp(s,0,0);//调用递归函数,开始下标设置为0,打点个数为0
           return result; 
        }
        public void fuyuanIp(String s,int startindex,int pointsum){//递归函数
            if(pointsum == 3){//结束条件,打点数量为3时,说明只剩后面需要判断
            //此处为什么不用最大长度作为结束条件?
            //本题只需要对中间的地方进行打点,最后不需要,所以就不能使用最大长度
                if(isvalid(s,startindex,s.length()-1)){//判断最后剩余字符串是否合法ip
                    result.add(s);
                }
                return;
            }
            for(int i=startindex;iend){//范围异常,返回false
                return false;
            }
            if(s.charAt(start) == '0' && start!=end){//首字符为0,返回false
                return false;
            }
            int num=0;
            for(int i=start;i<=end;i++){
                if(s.charAt(i)<'0'||s.charAt(i)>'9'){return false;}//含有非法字符,返回false
            }
                num =num*10 + (s.charAt(i)-'0');
                if(num>255){return false;}//值大于255,返回false
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    最近一段时间的规划
    【LeetCode】掉落的方块 [H](线段树)
    【从零开始】Docker Desktop:听说你小子要玩我
    指针进阶2
    SPINE:高拓展性、用户友好的自动化日志解析新神器
    软件开发项目文档系列之三如何撰写项目招标文件
    浅谈人工智能视频分析技术的原理及行业场景应用
    【JavaEE】Spring核心与设计思想(控制反转式程序演示、IoC、DI)
    SpringCloudSleuth异步线程支持和传递
    rabbitMQ
  • 原文地址:https://blog.csdn.net/qq_42325147/article/details/127823822