Leetcode| 93. 复原IP地址、78. 子集、90.子集II Day28

93. Restore IP Addresses

题目做法与回文串类似
终止条件是跳过添加.的数量判断
写代码时遇到了一个坑点,代码随想录中提供的代码isVaild()函数是传入原数组和切割的首尾index,我则是直接Python切片
因为递归时和以往不同,下一轮的startIndexi + 2,所以有可能出现startIndex越界的情况,导致切割出的为[]
源代码通过if start > end判断,我这里需要判断s_cut是否等于[]
越界的情况
93

class Solution:
    def __init__(self):
        self.res = []

    def isVaild(self, s_cut):
        if s_cut == []: # 因为startIndex每次+2,所以有可能出现超过len(s_list)的情况,s_cut为[]
            return False
        if s_cut[0] == '0' and len(s_cut) > 1:
            return False
        for char in s_cut:
            if char < '0' or char > '9':
                return False
        if int(''.join(s_cut)) > 255:
            return False

        return True
        

    def backtracking(self, s_list, startIndex, pointNum):
        # 终止条件:已经有三个点
        if pointNum == 3:
            if self.isVaild(s_list[startIndex:]):    # 第四段是否有效
                self.res.append(''.join(s_list))
            return
        
        for i in range(startIndex, len(s_list)):
            if self.isVaild(s_list[startIndex: i + 1]): # 分割出的这段有效
                s_list.insert(i + 1, '.')
                pointNum += 1
                self.backtracking(s_list, i + 2, pointNum)  # 递归,多了一个'.',所以i+2
                pointNum -= 1       # 回溯
                s_list.pop(i + 1)
            else:
                break   # 不合法,直接结束本层循环

    def restoreIpAddresses(self, s: str) -> List[str]:
        self.backtracking(list(s), 0, 0)
        return self.res

78. Subsets

与之前的组合问题不同,自己问题不是在叶子节点收集而是在所有节点收集

class Solution:
    def __init__(self):
        self.path = []
        self.res = []

    def backtracking(self, nums, startIndex):
        self.res.append(self.path.copy())  # 每一个节点都要收集,要放在终止添加的上面,否则会漏掉自己

        # 终止条件
        if startIndex >= len(nums):
            return

        for i in range(startIndex, len(nums)):
            self.path.append(nums[i])
            self.backtracking(nums, i + 1)
            self.path.pop()     # 回溯

    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.backtracking(nums, 0)
        return self.res

90. Subsets II

这题是78和40的结合

class Solution:
    def __init__(self):
        self.path = []
        self.res = []

    def backtracking(self, nums, startIndex, used):
        self.res.append(self.path.copy())

        if startIndex >= len(nums):
            return

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

    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        used = [False] * len(nums)
        self.backtracking(nums, 0, used)
        return self.res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值