D28|复原IP地址+子集

93.复原IP地址

1.题目
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
2.实现
思路是明了的,先弄清楚如何回溯,其次做题前需要划分好条件,在本题中成为IP地址需满足哪些条件呢?

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        res = []
        n = len(s)
        if n < 4 or n > 12:
            return res
        def findip(tmp, index):
            if index == n:
                if len(tmp) == 4:
                    res.append(".".join(tmp[:]))
                return
            for i in range(index, index + 3):
                if i >= n or (4 - len(tmp)) * 3 < (n - i):
                    break
                if i > index and s[index] == '0':
                    break
                if int(s[index:i + 1]) > 255:
                    break
                tmp.append(s[index:i + 1])
                findip(tmp, i + 1)
                tmp.pop() 
        findip([], 0)
        return res

3.文章讲解

78.子集

1.题目

2.实现
如何回溯呢?——建议自己画树或者类比
目前接触到的节点处理是要么选择该位置的值,要么选择该位置及以前的值

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []
        n = len(nums)
        def subset(tmp, index):
            res.append(tmp[:])  # 此时树的每个节点都应加入到结果集中
            if index == n:  # 终止条件可以不加
                return
            for i in range(index, n):
                tmp.append(nums[i])
                subset(tmp, i + 1)
                tmp.pop()
        subset([], 0)
        return res

3.文章讲解
注意:
如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点

拓展题目:90. 子集 II

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值