回溯模板

回溯法:
链接:https://leetcode-cn.com/problems/restore-ip-addresses
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址
参考解法:https://www.jianshu.com/p/014e50996391

class Solution(object):
    def restoreIpAddresses(self, s):
        #特殊条件判断 IP地址分为四段,即至少长度为4
        if len(s)<4:
            return []
        self.res = [] #总的路径集合
        self.path = []#每次的路径
        level = 1
        self.backtrace(s,[],level=1)
        return self.res
    def backtrace(self,selects,path,level):
        #1递归终止条件
        if len(selects) == 0 or level == 5:
            if len(selects) == 0 and level == 5:
                self.res.append(".".join(path))
                #  result.append(".".join(tmp_list))
            return
        for i in range(3): #每次至多选择三位数字
            if i<len(selects):#索引长度不能超过selects
                if self.isValid(selects[0:i+1]):
                    self.path.append(selects[0:i+1])#加入选择
                    self.backtrace(selects[i+1:],self.path,level+1)
                    self.path.pop()
        #需要撤销选择!!!这里的撤销,针对的是加入选择,因为for i in range(3)过程中加入其他选择

    def isValid(self, sub_s):
        if len(sub_s) > 1 and sub_s.startswith('0'):
            return False
        if 0 <= int(sub_s) <= 255:
            return True
        return False
                    # self.path.pop()#撤销选项

这里撤销选择的理解:为什么需要撤销选择,其实答案很简单,看上图决策树的最左边的分支,当遍历到 2.5.5.2 发现不合适的时候,需要回溯到 2.5.5,然后选择 25,也就是说最后的 2 加入 tmp_list 之后,判断不合适,递归返回之后,我们需要把 2 删除,然后腾出空间放 25,这也是为什么叫回溯算法的原因,遇到不符合目标的,就回头重新选择。当然了,遇到合适的,也要重新选择,是因为我们要选出所有合法的 ip 地址。
建议模板:https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/hui-su-suan-fa-dfs-suan-fa/hui-su-suan-fa-xiang-jie-xiu-ding-ban
https://leetcode-cn.com/problems/permutations/solution/46-quan-pai-lie-hui-su-fa-by-jue-qiang-z-jym3/

leetcode 47 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

class Solution(object):
    def permuteUnique(self, nums):

        res = []
        # ans = []
        n = len(nums)
        # path = []
        if not nums:
            return []


        def backtrace(selects,path,level):
            if level == n+1:
                res.append(path[:])
                return

            for i in range(len(selects)):
                if i >0 and selects[i] == selects[i-1]:
                    continue
                path.append(selects[i])
                backtrace(selects[:i]+selects[i+1:],path,level+1)
                path.pop()
        nums.sort() #排序去重

        backtrace(nums,[],1)



        return res
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值