更弱智的算法学习 day24

93.复原IP地址

完全的复杂掉了,没什么头绪,用之前的套路难以完全实现,这里重新缕一缕思路。

首先想好怎么处理数字字符串,因为ip地址的形式是"xxx.xxx.xxx.xxx",因此数组self.out中获取四个数,然后使用'.'.join连接成字符串,加入到res数组中即可,每一次获取的数可以是1-3位不等,因此每一次的range应该是从start位置开始到字符串结束,或者到start的后3位。

之后是判断合法ip的逻辑,首先每次加入out数组的数属于0-255;其次,首位为0时,那么长度一定为1;且每次获得的s的长度不能为0或大于3。经过上述检验就是合法ip段。

python 复制代码
class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        self.out = []
        self.res = []
        self.backtrack(0, s)
        return self.res

    def backtrack(self,start,s):
        if len(self.out) == 4:
            if start == len(s):
                self.res.append('.'.join(self.out))
            return
        
        for i in range(start,min(len(s), start+3)):
            if self.legalip(s[start:i+1]):
                self.out.append(s[start:i+1])
                self.backtrack(i+1, s)
                self.out.pop()

    def legalip(self, s):
        if int(s)<0 or int(s)>255:
            return False
        if s[0]=="0" and len(s) != 1:
            return False
        if len(s) == 0  or len(s)>3:
            return False
        return True

78.子集

子集和前面的不太一样。他每次self.out收集到一个自己,就需要保存下来,然后再记录终止条件。

python 复制代码
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.res = []
        self.out = []
        self.backtrack(nums, 0)
        return self.res

    def backtrack(self,nums,start):
        self.res.append(list(self.out))
        # if start >= len(nums):
        #     return

        for i in range(start, len(nums)):
            self.out.append(nums[i])
            self.backtrack(nums,i+1)
            self.out.pop()        

90.子集II

本题思路和前面40.组合总和II 非常类似,由于存在重复的元素,需要去重,还是一样的思路,构造used数组,标注数组里已经使用的数。查重的逻辑依然是if i>0 and numsi==numsi-1 and usedi-1 is False: 也即上一个数和这一个数相同,而且上一个数已经处理过了

python 复制代码
class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.res = []
        self.out = []
        self.used = [False] * len(nums)
        nums.sort()

        self.backtrack(0, self.used, nums)
        return self.res


    def backtrack(self, start, used, nums):
        self.res.append(list(self.out))
        if start >= len(nums):
            return

        for i in range(start, len(nums)):
            if i>0 and nums[i]==nums[i-1] and used[i-1] is False:
                continue
            self.out.append(nums[i])
            used[i] = True
            self.backtrack(i+1, used, nums)
            self.out.pop()
            used[i] = False

        
相关推荐
淡海水16 分钟前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
点心的游戏开发世界22 分钟前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
leobertlan34 分钟前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
2601_9621005441 分钟前
python包和模块的内容整理
python·模块·导入·虚拟环境·
二进制漫游记1 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
Tisfy1 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
tju新生代魔迷2 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
-今昭-2 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
乐迪信息2 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
2601_962381582 小时前
【转】Python渗透测试工具:sqlmap
python·渗透测试·sql注入·sqlmap·数据库安全