2026.1.29 复原ip地址 & 子集 & 子集2

93. 复原 IP 地址

python 复制代码
class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        n = len(s)
        res = []
        path = []

        def backtrack(startIndx : int) -> None:
            if startIndx == n and len(path) == 4:
                res.append(".".join(path))
                return
            remain_char = len(s) - startIndx
            remain_seg = 4 - len(path)
            if remain_char > 3 * remain_seg or remain_char < remain_seg :
                # 剪枝:如果剩余的字符串太多或太少,直接返回
                return

            for i in range(startIndx, min(startIndx + 3, len(s))):
                # 每个被分割的字串都在3或者字符串长度结尾以内
                subStr = s[startIndx:i + 1]

                if len(subStr) > 1 and subStr[0] == '0':
                    # 不能有前导零
                    break
                if int(subStr) > 255:
                    # 数值不大于255
                    break
                
                path.append(subStr)
                backtrack(i + 1)
                path.pop()
        backtrack(0)
        return res
                
            

78. 子集

这里用回溯和dp都能做,在实际算法中,回溯更偏向于搜索所有路径,dp更偏向于找出最优解

回溯

python 复制代码
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        # 决策树,每次都可以选择拿或不拿当前元素
        ans = []
        path = []
        n = len(nums)
        def backtrack(startIdx:int) -> None:
            ans.append(path[:])
            for i in range(startIdx, n):
                # 将当前元素放进子集中,代表选择当前元素
                path.append(nums[i])
                # 并进行下一次迭代,从剩余的列表中找出包含当前nums[i]的元素
                backtrack(i + 1)
                # 弹出当前元素,代表不选,下一次循环接着从下一个元素开始选
                path.pop()
            
        backtrack(0)
        return ans

dp

python 复制代码
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        dp = [[]]

        for num in nums:
            new_subsets = []
            for cur in dp:
                new_subsets.append(cur + [num])
            
            dp.extend(new_subsets)
        
        return dp

https://qcn7yki7og1q.feishu.cn/record/OWgEretm4eHCFec2E8GcYxrPnv9

杀死同一树层的判断逻辑

if i > startIdx and numsi == numsi - 1

python 复制代码
class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        ans = []
        path = []
        n = len(nums)
        nums.sort()
        def backstrack(startIdx:int) -> None:
            ans.append(path[:])

            for i in range(startIdx, n):
                if i > startIdx and nums[i] == nums[i - 1]:
                    continue
                path.append(nums[i])
                backstrack(i + 1)
                path.pop()

        backstrack(0)
        return ans
相关推荐
ZHOUPUYU8 分钟前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
某不知名網友8 分钟前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
一只专注api接口开发的技术猿9 分钟前
Open‑Claw 实战|告别页面逆向,快速搭建电商商品监控与数据分析完整方案
大数据·数据库·python·数据挖掘·数据分析
C++ 老炮儿的技术栈10 分钟前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
Nebula_g21 分钟前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
小灰灰搞电子27 分钟前
Rust+Slint 实现一个终端软件源码分享(半成品)
开发语言·rust
大鹏说大话28 分钟前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list
忆~遂愿31 分钟前
免密连接+快捷键+虚拟鼠标:ToDesk远程操作AI效率拉满
人工智能·python·深度学习·神经网络·自然语言处理·计算机外设·安全架构
宇卿.34 分钟前
C#语句:
开发语言·c#
ComPDFKit36 分钟前
用 ComPDF DocSlight 提取 PDF 表格:三种样本实测与 Python 接入
开发语言·python·pdf·pdf表格提取