六六力扣刷题回溯之复原 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 中的任何数字。你可以按 任何 顺序返回答案。

输入: s = "25525511135"
输出: ["255.255.11.135","255.255.111.35"]
复制代码
输入: s = "0000"
输出: ["0.0.0.0"]
复制代码


题解


package com.six.finger.leetcode.five;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
public class eighteen {
    public static void main(String[] args) {
    }
    public List<String> restoreIpAddresses(String s) {
        //临界条件的判断
        int len = s.length();
        //定义一个结果
        List<String> res = new ArrayList<>();
        // 如果长度不够,不搜索
        if (len < 4 || len > 12) {
            return res;
        }
        // 设置存储path的子集
        Deque<String> path = new ArrayDeque<>(4);
        int splitTimes = 0;
        //就是进行我们backtracing
        backtracing(s, len, splitTimes, 0, path, res);
        //返回结果
        return res;
    }
    private void backtracing(String s, int len, int split, int begin, Deque<String> path, List<String> res) {
        //判断退出条件
        if (begin == len) {
            if (split == 4) {
                res.add(String.join(".", path));
            }
            return;
        }
        for (int i = 0; i < 3; i++) {
            if (begin + i >= len) {
                break;
            }
            int ipSegment = judgeIfIpSegment(s, begin, begin + i);
            if (ipSegment != -1) {
                // 在判断是 ip 段的情况下,才去做截取
                path.addLast(ipSegment + "");
                backtracing(s, len, split + 1, begin + i + 1, path, res);
                path.removeLast();
            }
        }
    }
    //其实这个就是把string变成int类型
    private int judgeIfIpSegment(String s, int left, int right) {
        int len = right - left + 1;
        // 大于 1 位的时候,不能以 0 开头
        if (len > 1 && s.charAt(left) == '0') {
            return -1;
        }
        // 转成 int 类型
        int res = 0;
        for (int i = left; i <= right; i++) {
            res = res * 10 + s.charAt(i) - '0';
        }
        if (res > 255) {
            return -1;
        }
        return res;
    }
}
复制代码


分析


这题还是蛮难的,因为他考察的知识点有点多,首先你要对ip的相关知识熟悉,然后你要对回溯熟悉,对怎么把一个string的字符变成int类型,等等,我也是看答案做的,哎,太菜了。不过还是和大家一起总结总结

  • 第一步,就是做临界条件的判断,设置res,path,然后就是写回溯方法
  • 写回溯方法的时候,设计回溯的参数这里一个有2个参数需要注意,一个说切割的参数,一个是我们加的点号的参数
  • 然后就是写我们的结束条件了
  • 之前就是我们的循环,3位为一个循环,也就是 0,1,2
  • 然后判断每3位是不是一个ip端,通过ip变成数字之后 大小是0到255来判断
  • 之后就是把对的加入到path中,然后继续backtraceing
  • 最后回溯的时候remove调这个东西


结束


哈哈,越来越难了,大家加油,这种东西估计要多做几遍才行,我是一遍不能解决的,哎,太菜了


相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
50 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
算法
LeetCode第93题复原 IP 地址
文章介绍了LeetCode第93题"复原 IP 地址"的解法,利用回溯算法和剪枝技术,通过树形图分析求解过程,实现了将字符串分割成满足IP地址段要求的子段,并验证每个子段是否有效。
LeetCode第93题复原 IP 地址
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
56 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
28 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5