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

93.复原IP地址

回溯函数有四个参数,第一个是字符串,第二个是目前在字符串中的索引开头位置,第三个是目前的ip位置,第四个是已经放入ip的字符串。
回溯的条件是ip位置大于3,或者索引大于等于字符串的长度,在索引等于字符串长度并且ip位置刚好为3的时候把这个ip添加到输出结果中。
主体部分是做一个循环,因为ip每一位最多三个数字,所以可以取1~3个字符出来,取出来之后做判断这个数是否符合要求,如果是0则直接跳过取别的数目的字符,直接进入下一步的递归,索引+1,ip位置也加一,如果数字大于255则跳过这个可能。数字符合要求的话则进入下一步的递归,索引按照取的字符个数增加,ip位置+1。

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        self.ans = []
        self.backward(s, 0, -1, [])
        return self.ans
    def backward(self, string, index, position, pre):
        if position > 3:
            return
        if index >= len(string):
            if position == 3 and index == len(string):
                self.ans.append('.'.join(pre[:]))
            return 
        for i in range(3):
            if i == 0 and string[index] == '0':
                pre.append(string[index])
                self.backward(string, index+1, position+1, pre)
                pre.pop()
                break
            else:
                num = string[index:index+i+1]
                if int(num) > 255:
                    break
                pre.append(num)
                self.backward(string, index+i+1, position+1, pre)
                pre.pop()

78.子集

先把现在的添加到答案中再进行下一步迭代,因为是组合所以使用过的数字不会再使用,索引+1。

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.ans = []
        self.backward(nums, [])
        return self.ans
    def backward(self, nums, pre):
        self.ans.append(pre[:])
        for i in range(len(nums)):
            pre.append(nums[i])
            self.backward(nums[i+1:], pre)
            pre.pop()

90.子集II

在上一题的基础上多一个和前一个元素不相同再进入下一步的判断就行了

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        self.ans = []
        self.backward(nums, [])
        return self.ans
    def backward(self, nums, pre):
        self.ans.append(pre[:])
        for i in range(len(nums)):
            if i==0 or i>0 and nums[i] != nums[i-1]:
                pre.append(nums[i])
                self.backward(nums[i+1:], pre)
                pre.pop()
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stark的小笨手2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值