代码随想录day27

增加变量:pointsum,当有3个点,且startindex不超过len(隔板法通用),进入终止逻辑

终止逻辑:最后一段也valid,加入结果

!!!!string中没有insert和pop,自己写

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

    def insertchar(self,string, char, index):
        return string[:index] + char + string[index:]

    def deletechar(self, string, index):
        return string[:index] + string[index+1:]

    def _isvalid(self,s):
        if len(s) > 1 and s[0] == '0':
            return False
        if int(s) > 255:
            return False
        return True

    def restoreIpAddresses(self, s):
        self.operation(s,0,0)
        return self.res

    def operation(self,s,pointsum,startindex):
        if pointsum == 3 and startindex<len(s):
            if self._isvalid(s[startindex:len(s)]):
                self.res.append(s)
                return

        for i in range(startindex,len(s)):
            if self._isvalid(s[startindex:i+1]):
                pointsum += 1
                s=self.insertchar(s,".",i+1)
                self.operation(s,pointsum,i+2)
                pointsum -= 1
                s=self.deletechar(s,i+1)

简单,注意每层都记录即可

class Solution(object):
    def __init__(self):
        self.path=[]
        self.res=[]
    def subsets(self, nums):
        self.res.append([])
        self.backtracing(nums,0)
        return self.res

    def backtracing(self,nums,startindex):
        if len(self.path)==len(nums):
            return 

        for i in range(startindex,len(nums)):
            self.path.append(nums[i])
            self.res.append(self.path[:])
            self.backtracing(nums,i+1)
            self.path.pop()
    

使用used数组,记住两个犯错的点

if i>0 and nums[i-1]==nums[i] and self.used[i-1]==0:
                continue

class Solution(object):

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

    def subsetsWithDup(self, nums):
        self.used=[0]*len(nums)
        self.res.append([])
        nums.sort()
        self.backtracing(nums,0)
        return self.res

    def backtracing(self,nums,startindex):
        if len(self.path)==len(nums):
            return 

        for i in range(startindex,len(nums)):
            if i>0 and nums[i-1]==nums[i] and self.used[i-1]==0:
                continue
            self.path.append(nums[i])
            self.res.append(self.path[:])
            self.used[i]=1
            self.backtracing(nums,i+1)
            self.used[i]=0
            self.path.pop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值