代码随想录刷题28天|93.复原IP地址,78.子集,90.子集II

93.复原IP地址

回溯的时候,就将刚刚加入的分隔符. 删掉就可以了,pointNum也要-1。

最后就是在写一个判断段位是否是有效段位了。

主要考虑到如下三点:

  • 段位以0为开头的数字不合法
  • 段位里有非正整数字符不合法
  • 段位如果大于255了不合法
  • class Solution:
        def restoreIpAddresses(self, s: str) -> List[str]:
            results = []
            self.backtracking(s, 0, [], results)
            return results
    
        def backtracking(self, s, index, path, results):
            if index == len(s) and len(path) == 4:
                results.append('.'.join(path))
                return
    
            if len(path) > 4:  # 剪枝
                return
    
            for i in range(index, min(index + 3, len(s))):
                if self.is_valid(s, index, i):
                    sub = s[index:i+1]
                    path.append(sub)
                    self.backtracking(s, i+1, path, results)
                    path.pop()
    
        def is_valid(self, s, start, end):
            if start > end:
                return False
            if s[start] == '0' and start != end:  # 0开头的数字不合法
                return False
            num = int(s[start:end+1])
            return 0 <= num <= 255
    

78.子集

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result=[]
        path=[]
        self.backtracking(nums,0,path,result)
        return result

    def backtracking(self,nums,startIndex,path,result):
        result.append(path[:])#收集子集,要放在终止添加的上面,否则会漏掉自己
        if startIndex >=len(nums):
            return#终止条件可不加

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

90.子集II

class Solution:#回溯,利用used数组去重
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        result=[]
        path=[]
        used=[False]*len(nums)
        nums.sort()#去重需要排序
        self.backtracking(nums,0,used,path,result)
        return result


    def backtracking(self,nums,startIndex,used,path,result):
        result.append(path[:])
        for i in range(startIndex,len(nums)):
            # used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过
            # used[i - 1] == False,说明同一树层 nums[i - 1] 使用过
            # 而我们要对同一树层使用过的元素进行跳过
            if i > 0 and nums[i]==nums[i-1] and not used[i-1]:
                continue
            path.append(nums[i])
            used[i]=True
            self.backtracking(nums,i+1,used,path,result)
            used[i]=False
            path.pop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值