2023-12-26分割回文串和子集以及子集II

news2024/11/15 14:05:51

131. 分割回文串

在这里插入图片描述

思想:回溯三步骤!① 传入参数 ② 回溯结束条件 ③ 单层搜索逻辑!抽象成回溯树,树枝上是每次从头部穷举切分出的子串,节点上是待切分的剩余字符串【从头开始每次往后加一】

img

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        result = []
        self.backtrack(s,0,[],result)
        return result
    
    def backtrack(self, s, start, temp_list, result):
        # 结束条件?当start遍历到s的长度的时候说明子串都满足条件
        if start == len(s):
            # [:]这个很重要!不小心的会丢失了数据
            result.append(temp_list[:])
            return 
        for i in range(start,len(s)):
            # 如果满足子串是回文串继续递归,否则在原基础往后移动
            if self.huiwenchuan(s, start, i):
                # 当前节点 i + 1
                temp_list.append(s[start:i + 1])
                self.backtrack(s, i + 1, temp_list, result)
                # 回溯操作
                temp_list.pop()
    # 判断回文子串
    def huiwenchuan(self, s, start1, end1):
        start = start1
        end = end1
        while start < end:
            if s[start] != s[end]:
                return False
            start += 1
            end -= 1
        return True
        

78. 子集

思路:组合问题和分割问题就是收集回溯树叶子节点!而子集就是找树的所有节点!需要考虑是否有序?其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

78.子集

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result = []
        result.append([])
        self.backtrack(nums, [], 0, result)
        return result
        
    def backtrack(self, nums, temp_list, start_index, result):
        if len(temp_list) >= 1:
            result.append(temp_list[:])
            # 取树上的节点了 不需要return i + 1 会自动结束
        for i in range(start_index, len(nums)):
            temp_list.append(nums[i])
            self.backtrack(nums, temp_list, i + 1, result)
            temp_list.pop()

90. 子集 II

思路:和78.子集 (opens new window)区别就是集合里有重复元素了,而且求取的子集要去重。简单一点就排序后,进行获取子集!或者树层去重或树枝去重

90.子集II

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        result = []
        result.append([])
        nums.sort()   # 为什么加了这个就能通过?对子集进行排序的时候会发现有重复的子集了
        self.backtrack(nums, [], 0, result)
        return result
        
    def backtrack(self, nums, temp_list, start_index, result):
       # 关键是去重
        if len(temp_list) >= 1:
            if temp_list not in result:
                result.append(temp_list[:])
            # 取树上的节点了 不需要return
        for i in range(start_index, len(nums)):
            temp_list.append(nums[i])
            self.backtrack(nums, temp_list, i + 1, result)
            temp_list.pop()
            
class Solution:
    def subsetsWithDup(self, nums):
        result = []
        path = []
        nums.sort()  # 去重需要排序
        self.backtracking(nums, 0, path, result)
        return result

    def backtracking(self, nums, startIndex, path, result):
        result.append(path[:])  # 收集子集
        uset = set()
        for i in range(startIndex, len(nums)):
            if nums[i] in uset:
                continue
            uset.add(nums[i])
            path.append(nums[i])
            self.backtracking(nums, i + 1, path, result)
            path.pop()
class Solution:
    def subsetsWithDup(self, nums):
        result = []
        path = []
        used = [False] * len(nums)
        nums.sort()  # 去重需要排序
        self.backtracking(nums, 0, used, path, result)
        return result

    def backtracking(self, nums, startIndex, used, path, result):
        result.append(path[:])  # 收集子集
        for i in range(startIndex, len(nums)):
            # used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过
            # used[i - 1] == False,说明同一树层 nums[i - 1] 使用过
            # 而我们要对同一树层使用过的元素进行跳过
            if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:
                continue
            path.append(nums[i])
            used[i] = True
            self.backtracking(nums, i + 1, used, path, result)
            used[i] = False
            path.pop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1353184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于混合蛙跳优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

ChatGPT持续火热,OpenAI年收入突破16亿美元

著名科技媒体The Information消息&#xff0c;由于OpenAI的ChatGPT等产品实现强劲增长&#xff0c;其年收入将突破16亿美元。 这主要得益于OpenAI在2023年发布了一系列重磅产品&#xff0c;包括GPT-4、ChatGPT企业版、GPT-4 Turbo、DALLE 3、苹果/安卓应用、自定义GPTs、Assis…

测试人必看,看完必会的fiddler抓包,抓包抓的好........

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

ELF文件信息一览

准备开个专栏&#xff0c;记录《从零开始实现链接器》的学习过程&#xff0c;先占个坑。 之前一直想把自己的学习过程记录在个人博客网站上&#xff0c;但这个要自己维护&#xff0c;上传图片什么的比较麻烦。关键是没有人互动&#xff0c;自己也没有怎么去看&#xff0c;慢慢的…

麒麟云增加计算节点

一、安装基座系统并配置好各项设置 追加的计算节点服务器&#xff0c;安装好系统&#xff0c;把主机名、网络网线&#xff08;网线要和其他网线插的位置一样&#xff09;、hosts这些配置好&#xff0c;在所有节点的/etc/hosts里面添加信息 在控制节点添加/kylincloud/multinod…

解决Redis序列化乱码问题

如果我们使用原生的JDK序列化&#xff0c;那么当我们将数据存储到Redis中就会出现乱码的情况 为了解决这个问题我们需要重写RedisTemplate从而解决序列化乱码问题 首先在Maven中引入相应的依赖 <dependency> <groupId>com.fasterxml.jackson.core</group…

交换机01_以太网

1、交换机工作原理 交换机是数据链路层的设备&#xff0c;数据链路层传输的是数据帧&#xff0c;所以封装的是MAC头部&#xff08;主要有源MAC地址和目的MAC地址&#xff09; 2、数据链路层的功能&#xff1a; 建立逻辑连接&#xff0c;进行物理地址寻址&#xff0c;差错校验…

CMake入门教程【核心篇】安装(install)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2. 使用方法2…

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于头脑风暴优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具&#xff0c;一直被许多网友们所喜欢&#xff0c;使用简单、方便。 UltraISO官方下载地址&#xff1a;https://cn.ultrais…

Halcon顶帽运算与底帽运算的应用

Halcon顶帽运算与底帽运算的应用 文章目录 Halcon顶帽运算与底帽运算的应用1. 提取小的物件2. 校正非均匀光照 正如上文所说的&#xff0c;顶帽运算返回的像素部分是尺寸比结构元素小的&#xff0c;并且比较亮的局部小区域&#xff1b;底帽运算返回的像素部分是尺寸比结构元素小…

【EI会议征稿通知】第三届艺术设计与数字化技术国际学术会议( ADDT 2024)

第三届艺术设计与数字化技术国际学术会议( ADDT 2024&#xff09; 2024 3rd International Conference on Art Design and Digital Technology 所谓艺术设计&#xff0c;就是将艺术的审美感应用到与日常生活密切相关的设计中&#xff0c;使其不仅具有审美功能&#xff0c;而且…

Arduino定时器和定时器中断

目录 一、定时器中断库函数方式说明 1、定时器中断编号和引脚说明 2、库文件安装 3、MsTimer2库文件使用 4、TimerOne库文件使用 5、注意事项 二、定时器的寄存器配置说明 1、定时器寄存器列表说明 2、Timer0寄存器说明 3、预分频系数与比较匹配器 4、定时器模式 …

天津大数据培训机构 大数据时代已到来!

大数据时代已经来临&#xff0c;越来越多的人开始关注大数据&#xff0c;并且准备转行大数据。但是&#xff0c;对于一个外行人或者小白来说&#xff0c;大数据是什么&#xff1f;大数据需要学什么&#xff1f;什么样的大数据培训机构是靠谱的&#xff1f;这几个简单的问题就足…

xpath定位--切换frame/窗口

在web自动化中&#xff0c;有时候我们界面上明明定位到了该元素&#xff0c;但是就是点击不到&#xff0c;怎么回事&#xff1f; --可能是没有切换到对应的frame或者没有切换到对应窗口&#xff01;&#xff01;&#xff01; 切换frame用于在同一个窗口中切换到frame上下文&a…

SpringBoot之多环境开发配置

1 多环境开发配置 问题导入 在实际开发中&#xff0c;项目的开发环境、测试环境、生产环境的配置信息是否会一致&#xff1f;如何快速切换&#xff1f; 1.1 多环境启动配置 yaml文件多环境启动 不同环境使用—隔开 示例代码&#xff1a; spring:profiles:active: dev#生产…

Spring Bean的生命周期(钩子函数)

借鉴&#xff1a;https://www.cnblogs.com/liweimingbk/p/17843970.html https://blog.csdn.net/lxz352907839/article/details/128634404 一、Spring Bean生命周期 如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口&#xff0c;那么在加载Spring配置文…

C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 成功的秘诀就在于多努力一次&#xff…

后端杂七杂八系列篇一

后端杂七杂八系列篇一 ① MySQL选择合适的数据类型① Char与Varchar② Text与Blob ② EqualsAndHashCode(callSuper true)的作用③ mybatis-plus 相关① 主键生成策略② 使用Model实现CRUD③ Wrapper的用法① Wrapper的继承关系② 项目中最常用的warpper [LambdaQueryWrapper]…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、​​​​​​​使用示例