131. 分割回文串-思路整理
创始人
2024-02-07 03:49:55
0

题目

给你一个字符串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[:])returnfor 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)

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...