代码随想录算法训练营第28天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 

题目链接/文章讲解:代码随想录

视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili

首先设置path和结果列表

因为ip只能至多有12个数字,s大于12的话直接返回。 设置回溯方程(s和start_index,start_index为每次递归开始操作的index),如果当前path==4且start_index已经进行到最后s最后了 说明当前path是一个排列 ,放入res并返回。 如果path长度>4了 说明无需继续递归。然后设置for loop, 从start_index遍历到s,设置一个temp为start_index到i+1的s,如果当前这个temp满足条件=0或者在256和0之间且首字符不是0的话,叫他放进path里并递归,递归带入的参数是当前i的下一位 return回来时要注意回溯。 

最后返回值

class Solution(object):
    def __init__(self):
        self.path= []
        self.res = []
    def restoreIpAddresses(self, s):
        """
        :type s: str
        :rtype: List[str]
        """
        if len(s)>12:
            return
        def backtracking(s,start_index):
            if len(self.path)==4 and start_index == len(s):
                self.res.append(".".join(self.path))
                return 
            if len(self.path) > 4:
                return 
            for i in range(start_index,len(s)):
                temp=s[start_index:i+1]
                if (int(temp)<256 and int(temp)>0 and temp[0]!='0') or (temp=='0'):
                    self.path.append(temp)
                    backtracking(s, i+1)
                    self.path.pop()
        backtracking(s, 0)
        return self.res


78.子集 

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解:代码随想录

视频讲解:回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili

解题思路:

先建立列表path 和res。

设置回溯方程,因为没有重复元素,所以可以直接将当前path复制进res。 设置base condition 如果start_index 等于nums的长度的话,说明已经到达最后一个字符,可以返回。 再写for loop,从start_index到字符最后的的循环,append当前nums[i]进path,然后递归,递归返回后则回溯。 

返回res

class Solution(object):
    def __init__(self):
        self.path = []
        self.res = []
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def backtracking(nums,start_index):
            self.res.append(self.path[:])
            if start_index == len(nums):
                return
            for i in range(start_index,len(nums)):
                self.path.append(nums[i])
                backtracking(nums,i+1)
                self.path.pop()

        backtracking(nums,0)
        return self.res    

90.子集II 

题目链接/文章讲解:代码随想录

视频讲解:回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibili

解题思路:

首先建立列表path 和res。

为查重提前做准备sort nums

设置回溯方程,因为没有重复元素,所以可以直接将当前path复制进res。 设置base condition 如果start_index 等于nums的长度的话,说明已经到达最后一个字符,可以返回。 再写for loop,从start_index到字符最后的的循环,进行查重,如果当前i>start_index且当前数字等于前一个数字的话 就可以跳过。 查重后可以append当前nums[i]进path,然后递归,递归返回后则回溯。 

返回res

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

    def subsetsWithDup(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        def backtracking(nums, start_index):
            self.res.append(self.path[:])
            if start_index == len(nums):
                return
            for i in range(start_index,len(nums)):
                if i > start_index and nums[i] == nums[i-1]:
                    continue
                self.path.append(nums[i])
                backtracking(nums,i+1)
                self.path.pop()
        backtracking(nums,0)
        return self.res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值