【Day21】LeetCode:93. 复原IP地址,78. 子集,90. 子集 II

文章目录

  • [LeetCode:93. 复原IP地址](#LeetCode:93. 复原IP地址)
  • [LeetCode:78. 子集](#LeetCode:78. 子集)
  • [LeetCode:90. 子集 II](#LeetCode:90. 子集 II)

LeetCode:93. 复原IP地址

https://leetcode.cn/problems/palindrome-partitioning/description/

思路

  1. 从当前起始位置开始,分别截取长度为1、2、3的子串。
  2. 检查该子串是否是一个合法的 IP 段。
  3. 如果合法,则将其加入 path ,并递归处理剩下的字符串和剩下的段数。
  4. 当已经得到四个段并且正好用完了整个字符串时,就找到了一个有效 IP 地址,将其加入结果。

解答

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

        if n < 4 or n > 12: # 长度不符合,必然无法组成IP
            return results

        def backtrack(start: int, remain: int): # remain表示剩余几段
            if n - start < remain or n - start > 3 * remain: # 剩余长度不符合要求
                return

            if remain == 0 and start == n: # 已分割四段、且字符用完
                results.append(".".join(path))
                return
                        
            for length in range(1, 4): # 分别截取长度为1, 2, 3的子串
                if start + length > n:
                    break
                sub_s = s[start:start+length]
                
                if length > 1 and sub_s[0] == '0': # 前导零
                    continue
                
                if int(sub_s) > 255: # 超过范围
                    continue
                
                path.append(sub_s)
                backtrack(start + length, remain - 1)
                path.pop()

        backtrack(0, 4)
        return results

LeetCode:78. 子集

https://leetcode.cn/problems/subsets/

解答

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

        def backtrack(start: int):
            results.append(path[:])
                
            for end in range(start, n):
                path.append(nums[end])
                backtrack(end + 1)
                path.pop()

        backtrack(0)
        return results

LeetCode:90. 子集 II

https://leetcode.cn/problems/subsets-ii/description/

思路

首先对数组进行排序,后续同一层的递归中,如果遇到元素相同则跳过。

解答

python 复制代码
class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort() # 排序,方便后续去重
        n = len(nums)
        results = []
        path = []

        def backtrack(start):
            results.append(path[:])

            for i in range(start, n):
                if i > start and nums[i] == nums[i-1]: # 同一层递归中,如果当前元素与前一个相同,跳过
                    continue

                path.append(nums[i])
                backtrack(i + 1)
                path.pop()
    
        backtrack(0)
        return results
相关推荐
烂蜻蜓6 分钟前
Flask入门教程(十五):错误处理与日志——打造健壮的Web应用
前端·python·flask
2401_8906034015 分钟前
Python入门语法(一)
java·开发语言·python
烂蜻蜓21 分钟前
Flask入门教程(十六):中间件与扩展——增强应用功能的两种机制
python·中间件·flask
烂蜻蜓2 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
jay神2 小时前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
满怀冰雪3 小时前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
DeepVisionary9 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
阡之尘埃9 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
裕晟资质规划9 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法