代码随想录算法训练营第二十四天|LeetCode 93.复原IP地址、78.子集、90.子集II

93.复原IP地址

文档讲解:代码随想录

视频讲解:

状态:大体上思路可以写出来。细节关于255的判断,elif len(s[startIndex:i+1]) == 3 and s[0]*100+s[1]*10+s[2] - '0' <= 255:报错TypeError: unsupported operand type(s) for -: 'str' and 'str' 。不能对字符串进行减法运算,需要先将字符串转换为整数,然后再进行比较!关于前导0的判断,也没写对。关于for循环的剪枝,没有进一步探索。

一方面要把所有的可能切割出来,一方面要筛选符合条件的 加入结果集。

可以运行对的初级版本:

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        self.path = []
        self.results = []
        self.backtracking(s,0)
        return self.results

    def backtracking(self,s,startIndex):
        if len(self.path) == 4 and startIndex >= len(s):  # 有效IP地址只能由四个整数组成,startIndex是分割线
            ipAddress = ".".join(self.path) # 我想的是先用数组,之后再转为字符串,并用.分隔!
            self.results.append(ipAddress)
            return
        
        for i in range(startIndex,len(s)):
            # 在单层搜索逻辑中,判断子串是否合法,若合法才添加到path中并继续递归
            if (len(s[startIndex:i+1]) > 1 and s[startIndex] == '0') or int(s[startIndex:i+1]) > 255:  
            # 注意当前子串是[startIndex,i]左闭右闭区间,第一个字母是s[startIndex],不是s[0]!
                continue  # 若子串含有前导0,或子串的值大于255,直接跳过当前循环
            self.path.append(s[startIndex:i+1])
            self.backtracking(s,i+1) # 递归时 startIndex +1
            self.path.pop()

deepseek给出的意见,修改后:

关于for循环的剪枝,我觉得和 组合 问题中的不一样。

也可以说不是剪枝,而是一个必须的限制。如果不限制 IP 段长度:for i in range(startIndex, len(s)) 可能生成超过 3 位的子串(如 i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值