• leetcode93. 复原 IP 地址




    题目

    有效 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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思考

    • 1、分割题----使用回溯完成
    • 2、分割题目应该是回溯法中最难的题型了
    • 3、像这种还需要写判断函数

    代码和注释

    /**
        切割问题
        使用回溯算法
        1、确定递归函数的参数
        2、终止条件
        3、每层干的事
     */
    class Solution {
        // 返回结果集
        List<String> res = new ArrayList<>();
    
        public List<String> restoreIpAddresses(String s) {
            backtacking(s, 0, 0);
            return res;
        }
        // str,开始位置,点的个数是我们递归的深度
        public void backtacking(String str, int startIdx, int pointCount){
            // 递归结束,就是分隔点3个的时候
            if(pointCount == 3){
                // 判断第三个点后面的那一段值是不是符合条件
                if(isValid(str, startIdx, str.length() - 1)){
                    res.add(str);
                }
            }
    
            // 进入迭代递归
            for(int i = startIdx; i < str.length(); i++){
                // 判断合法性
                if(isValid(str, startIdx, i)){
                    // 增加点
                    str = str.substring(0, i + 1)+"."+str.substring(i+1);
                    pointCount ++;
                    backtacking(str, i +2,pointCount);
                    // 回溯
                    pointCount --;
                    str =  str.substring(0, i + 1) + str.substring(i + 2);// 回溯删掉逗点
                }else{
                    // 直接跳出循环,因为这一段一定不合法
                    break;
                }
            }
        }
    
        // 判断值是不是在合法范围内
        public boolean isValid(String s, int start, int end){
            if (start > end) {
                return false;
            }
            if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
                return false;
            }
            int num = 0;
            for (int i = start; i <= end; i++) {
                if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
                    return false;
                }
                num = num * 10 + (s.charAt(i) - '0');
                if (num > 255) { // 如果⼤于255了不合法
                    return 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
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    总结

    • 1、由回文串分割我们知道,这种题型难点在于判断值得合法性
    • 2、从起始位置到结束位置对目标得切割点得定义(在嵌套for循环中进行递归)
  • 相关阅读:
    Taro 小程序开启wxml代码压缩
    【flink进阶】-- Flink kubernetes operator 版本升级
    MySQL---优化&日志
    基于神经网络的智能系统,神经元网络控制的作用
    【原创】十年带队经验,万字长文分享:如何管理好一个程序员团队?
    【FaceRevelio】一种用于智能手机的带有前置摄像头的 人脸活跃度检测系统
    react 组件间的通信
    缺流量时代,App们需要如何突围?
    敏感词过滤--golang
    C++面试八股文:override和finial关键字有什么作用?
  • 原文地址:https://blog.csdn.net/weixin_46643875/article/details/128072163