131. 分割回文串-思路整理

news2024/10/6 6:51:21

题目

给你一个字符串s,请你将 s分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。

回文串: 是正着读和反着读都一样的字符串。

输入:s = "aab"

输出:[["a","a","b"],["aa","b"]]

题解

该题目看到后首先想到的是动态规划,但是在写状态方程时发现很难写出有效的转移议程。。

通过分析发现其有回溯的特性。回溯算法的相关介绍参考大神的博客:LeetCode--回溯法心得 - 知乎。

该算法的过程与人工思考的方式想同,以字符串"aaba"为例来说明算法的计算过程。

第一步

我们要找到以第一个字符a开头的回文串,然后把字符串切割成一个回文串与其余部分。其结果如下图所示。

 

由于后面两个结果的前面的子串并不是回文串因此就不继续考虑这两种情况。

第二步

只需要考虑前面两种情况的未处理的子串,如果第一个后半段的子串aba的处理如下图所示。

第二个字符串的未处理子串ba的如下图所示。

整个过程如下图所示。

最终

中间过程相似就不一一枚举最后上一下最终结果如下图所示。

总结起来其实主要是两个模块:划分与回文串判定。

优化

回文串的判定可以进一步优化。对于前 2 个字符 aa,我们有 2 种分割方法 [aa]] 和 [a,a],当我们每一次搜索到字符串的b 时,都需要对b开始的子串判定是否是回文这就产生了重复计算。这种情况符合动态规划的使用条件。

dp[i][j]表示字符串s中的子中s[i:j]是否是回文。

状态转移方程如下所示。

dp[i][j]=dp[i+1][j-1] and s[i]==s[j]

代码

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        #初始化状态矩阵
        dp = [[True] * n for _ in range(n)]
        #判定子串的回文状态,动态规划

        for i in range(n - 1, -1, -1):
            for j in range(i + 1, n):
                dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]
        ret = list()
        ans = list()
        #回溯的递归函数
        def dfs(i: int):
            if i == n:
                ret.append(ans[:])
                return
            for j in range(i, n):
                if dp[i][j]:
                    ans.append(s[i:j+1])
                    dfs(j + 1)
                    #状态复原
                    ans.pop()
        dfs(0)
        return ret

算法复杂度

时间复杂度:O(n*2^n)。

空间复杂度o(n^2)

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

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

相关文章

Advances in Graph Neural Networks笔记4:Heterogeneous Graph Neural Networks

诸神缄默不语-个人CSDN博文目录 本书网址:https://link.springer.com/book/10.1007/978-3-031-16174-2 本文是本书第四章的学习笔记。 感觉这一章写得不怎么样。以研究生组会讲异质图神经网络主题论文作为标准的话,倒是还行,介绍了HGNN的常见…

【面试宝典】吐血整理的100道Java多线程并发面试题

吐血整理的108道Java多线程&并发面试题前言1、Java中实现多线程有几种方法2、继承 Thread 类 流程3、实现 Runnable 接口4、ExecutorService、 Callable、 Future 有返回值线程5、基于线程池的方式6、4 种线程池7、如何停止一个正在运行的线程8、notify()和notifyAll()有什…

Clean-label Backdoor Attack against Deep Hashing based Retrieval论文笔记

论文名称Clean-label Backdoor Attack against Deep Hashing based Retrieval作者Kuofeng Gao (Tsinghua University)出版社arxiv 2021pdf在线pdf代码无 简介:本文提出了首个针对 hashing 模型的 clean-label backdoor attack。生成 targeted…

图像传统处理算法-边缘检测-分割-增强-降噪

一、边缘检测 边缘检测的几种微分算子: 一阶微分算子:Roberts、Sobel、Prewitt 二阶微分算子:Laplacian、Log/Marr 非微分算子:Canny 一阶微分算子 1.Roberts: 没有经过图像平滑处理,图像噪声无法得到较好的抑制…

Proactive Privacy-preserving Learning for Retrieval 论文笔记

论文名称Proactive Privacy-preserving Learning for Retrieval作者Peng-Fei Zhang (University of Queensland)会议/出版社AAAI 2021pdf📄在线pdf代码无代码概要: 本文提出了一种针对检索系统隐私保护的方法,称为 PPL。训练一个生成器&#…

SPARKSQL3.0-Optimizer阶段源码剖析

一、前言 阅读本节需要先掌握【SPARKSQL3.0-Analyzer阶段源码剖析】 Optimizer阶段是对Analyzer分析阶段的逻辑计划【logicalPlan】做进一步的优化,将应用各种优化规则对一些低效的逻辑计划进行转换 例如将原本用户不合理的sql进行优化,如谓词下推&am…

PCB设计仿真之探讨源端串联端接

作者:一博科技高速先生成员 孙宜文 上期高速线生简单介绍了反射原理也提到了源端串联端接,笔者借此篇文章再深入探讨下,本文使用Sigrity Topology Explorer 17.4仿真软件。 搭建一个简单的电路模型,给一个上升沿和下降沿均为0.5…

学会使用这些电脑技巧,可以让你在工作中受益无穷

技巧一:设置计算机定时关机 第一步:快捷键win r打开运行窗口。 第二步:输入:shutdown -s -t 3600,其中数字3600表示3600秒,就是设置3600秒后关机。第三步:按确定完成设置。如果你想取消设置&…

吃透这份高并发/调优/分布式等350道面试宝典,已涨30k

前言 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试必备系列文章的初衷。 整理自己学过的知识,总结,让其成为一套体系,方便日后查阅。现在不少 Java …

【MySQL运行原理篇】底层运行结构

MySQL整体架构图 简略版图 1.1连接管理 一句话:负责客户端连接服务器的部分 网络连接层, 对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。服务器上维护一…

社交媒体营销策略——如何病毒式传播:增加受众范围的9个技巧

关键词:社交媒体营销、病毒式传播、受众 社交营销人员知道创建病毒式帖子并不是他们最重要的目标。事实上,这可能会分散他们接触目标受众和照顾团队心理健康的注意力。 这并不意味着您无法从病毒式传播的帖子和活动中学到一些东西。战略性病毒式营销可提…

5分钟搞懂https原理

概念 https(超文本传输安全协议)是一种以安全为基础的HTTP传输通道。 在了解HTTPS之前,我们首先来认识一下http: http(超文本传输协议),HTTP是tcp/ip族中的协议之一,也是互联网上…

React项目使用craco(由create-react-app创建项目)

适用:使用 create-react-app 创建项目,不想 eject 项目但想对项目中 wepback 进行自定义配置的开发者。 1.使用 create-react-app创建一个项目(已有项目跳过此步) $ npx create-react-app my-project 2.进入项目目录,…

一些http和tomcat知识补充

HTTP和HTTPS的区别  概念    HTTP英文全称是Hyper Text Transfer Protocol,超文本传输协议,用于在Web浏览器和网站服务器之间传递信息。 HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和…

D. Sequence and Swaps(思维)

Problem - 1455D - Codeforces 你的任务是使该序列排序(如果条件a1≤a2≤a3≤⋯≤an成立,它就被认为是排序的)。 为了使序列排序,你可以执行以下操作的任何次数(可能是零):选择一个整数i&#…

数据结构 | 带头双向循环链表【无懈可击的链式结构】

不要被事物的表面现象所迷惑~🌳前言🌳结构声明🌳接口算法实现🍎动态开辟&初始化【Init】🍎尾插【PushBack】🍎尾删【PopBack】🍎头插【PushFront】🍎头删【PopFront】&#x1f4…

思科防火墙应用NAT

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 一.思科防火墙的NAT 一种有四种, 二.动态NAT 配置 三.动态PAT配置 四…

哪些城市有PMP考试考点?PMP考试考场都在哪?

有不少伙伴对PMP的考试点存在一定的疑问,全国PMP考试具体考点位置是在哪呢? 根据过往常用考点,我们给大家汇总了2022年PMP考试全国考场地址,一起来看看吧! 表格信息来自基金会官网11月27日PMP报名通知,仅作…

Spring Security多种用户定义方式

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 Spring Security中存在两种类型的AutnenticationManager,一种是全局的AuthenticationManager,一种是局…

原版畅销36万册!世界级网工打造TCP/IP圣经级教材,第5版终现身

关于TCP/IP 现代网络中,以窃取信息或诈骗为目的的网站频频出现,蓄意篡改数据以及信息泄露等犯罪行为也在与日俱增。很多情况下,人们可能会认为人性本善,在享受着网络所带来的便捷性的同时,也就降低了对网络犯罪的设防…