第二十八天|回溯

文章介绍了使用回溯法解决LeetCode中的93题RestoreIPAddresses和78题Subsets,以及如何处理90题SubsetsII中的重复元素问题。在RestoreIPAddresses中,关键在于判断字符串段是否为有效的IP地址部分;在Subsets中,通过回溯生成所有可能的子集;在SubsetsII中,通过比较当前元素与前一个元素来去除重复子集。
摘要由CSDN通过智能技术生成

今天的题相对于昨天有点难

93. Restore IP Addresses

这道题是今天最难的,虽然和昨天的划分字串有点相似,但是涉及到对string的操作

Way1:

每次回溯的时候判断给原来的字符串加了几个点,如果是三个点就判断最后一段符不符合要求,其他的还是回溯的逻辑,对于字符串用+-去做append和pop,还有要判断当前段是不是valid的.valid有三个条件

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        res=[]
        def valid(s,start,end):
            if start>end:
                return False
            if s[start]=='0' and start!=end:
                return False
            if int(s[start:end+1]) >255:
                return False
            return True

        def dfs(index,s,num_pointer):
            if num_pointer==3:
                if valid(s,index,len(s)-1):
                    res.append(s[:])
                return
            for i in range(index,len(s)):
                if valid(s,index,i):
                    s=s[:i+1]+'.'+s[i+1:]
                    dfs(i+2,s,num_pointer+1)
                    s=s[:i+1]+s[i+2:]
                else:
                    break
        if len(s)>12:
            return []
        dfs(0,s,0)
        return res

78. Subsets

这道题和之前的回溯差不多

Way1

每次回溯一个,回溯前先把上一个加到ressult里面.并且新的加入到当前的判断段里面

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res=[]
        path=[]
        def dfs(index):
            if index>len(nums):
                return
            res.append(path[:])
            for i in range(index,len(nums)):
                path.append(nums[i])
                dfs(i+1)
                path.pop()
        dfs(0)
        return res

90. Subsets II

这道题和昨天的去重题是一样的

Way1:

在78题的基础上,判断一下当前元素是不是和上一个元素是一样的

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        res=[]
        path=[]
        nums.sort()
        def dfs(index):
            if index>len(nums):
                return
            res.append(path[:])
            for i in range(index,len(nums)):
                if i!=index and nums[i]==nums[i-1]:
                    continue
                path.append(nums[i])
                dfs(i+1)
                path.pop()
        dfs(0)
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值