LeetCode 93.复原IP地址 LeetCode 78.子集 LeetCode 90.子集II

LeetCode 93.复原IP地址

其实思想跟回文字符串那道题是类似的,但难点在于这道题的终止条件和判断是否IP地址进行划分后是否合理?

思路:

  • 通过一个int类型的全局变量来记载 " . " 的数目 / 记录你当前所获得的小数组的数目,如果 " . " 的数目为3,则证明你现在已经分割好了。但是你分割的不一定准确,因此你需要看你最后的" . "后面的数字数目,如果后面的数字数目大于3,则证明这是一个错误的分割。
  • 另外,当横向遍历的数字长度大于3时,后续的就可以不用进行遍历,如2255,2255.xxx是错误的表示。
  • 其他的思路与"回文字符串" 类似

这道题难就难在,1. 对于数字的范围 你需要判断是否正确。 2. 对于原字符串内里面存在有不是数字的元素 ,如果存在有元素不是数字的,那这个IP地址就肯定是不存在的。3. 你还需要判断0的情况,如果一个小数字字符串,第一个数字是0,但这个字符串长度不为1 ,那就是错误的分割方法。即开头数字不能为0,但允许有单个0的分割方法。 因此,is_Valid函数作为这道题的**终止条件,**具有关键的作用。

手撕Code:

python 复制代码
class Solution(object):
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        
        self.result = []
        self.path = []
        self.point = 0          ### 记录 "." 的数目

        self.backtracking(s, 0, self.point)
        return self.result

    def backtracking(self, num_str, start_index, point):

        if self.point == 3:
            if self.isValid(num_str, start_index, len(num_str)-1):
                self.path.append(num_str[start_index:])
                result = ".".join(list(self.path))
                self.path.pop()
                self.result.append(result)
            return 

        for i in range(start_index, len(num_str)):
            if self.isValid(num_str, start_index, i):       
                cur_process = num_str[start_index:i+1]
                self.path.append(cur_process)
                self.point += 1
                self.backtracking(num_str, i+1, self.point)
                self.point -= 1
                self.path.pop()
    
    def isValid(self, num_str, start, end):         ### 判断start 到 end(包括end)的这个子数字符合条件吗
        if start > end:     ## 索引不正确
            return False
        
        if num_str[start] == '0' and start != end:        ### 首数字为0,并且数字长度大于1
            return False
        
        num = 0
        for i in range(start, end + 1):     ## 左闭右开
            if not num_str[i].isdigit():          ## 字符串里存在不是数字的符号
                return False
            num = num*10 + int(num_str[i])        ## 获得这个数字字符串的数字大小
            if num > 255:                   ## 数字范围为(0, 255)
                return False
            
        return True

不用point全局变量的实现方式,len(self.path) == 3时,表示三个 " . " 前的都处理好了,现在就是对最后的进行判断,如果判断后可以的话需要添加进去转换为IP地址格式后后,再pop掉。

python 复制代码
        if len(self.path) == 3:
            if self.isValid(num_str, start_index, len(num_str)-1):
                self.path.append(num_str[start_index:])
                result = ".".join(list(self.path))
                self.path.pop()
                self.result.append(result)
            return 

        for i in range(start_index, len(num_str)):
            if self.isValid(num_str, start_index, i):       
                cur_process = num_str[start_index:i+1]
                self.path.append(cur_process)
                self.backtracking(num_str, i+1, self.point)
                self.path.pop()

LeetCode 78.子集

LeetCode 90.子集II

相关推荐
find1star8 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing8 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21128 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP9 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN10 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183110 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤11 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
职场的momo11 小时前
字节生活服务海量内推,挑战亿级订单与AI交易中台
人工智能·程序人生·面试·职场和发展·跳槽·生活·业界资讯
文心快码BaiduComate11 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran11 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分