【Leetcode刷题Python】131. 分割回文串

简介: LeetCode题目131的Python编程解决方案,题目要求将给定字符串分割成所有可能的子串,且每个子串都是回文串,并返回所有可能的分割方案。

1 题目

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

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

示例 1:

输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:

输入:s = “a”
输出:[[“a”]]

2 解析

当我们在判断 s[i…j] 是否为回文串时,常规的方法是使用双指针分别指向 ii和 j,每次判断两个指针指向的字符是否相同,直到两个指针相遇。然而这种方法会产生重复计算,例如下面这个例子:
当 s=aaba 时,对于前 2个字符aa,我们有 22种分割方法 [aa] 和 [a,a],当我们每一次搜索到字符串的第i=2 个字符b 时,都需要对于每个 s[i…j] 使用双指针判断其是否为回文串,这就产生了重复计算。

因此,我们可以将字符串 s 的每个子串]s[i…j] 是否为回文串预处理出来,使用动态规划即可。设f(i,j) 表示s[i…j] 是否为回文串,那么有状态转移方程:

\begin{cases} \texttt{True}, & \quad i \geq j \\ f(i+1,j-1) \wedge (s[i]=s[j]), & \quad \text{otherwise} \end{cases}


其中∧ 表示逻辑与运算,即 s[i…j] 为回文串,当且仅当其为空串(i>j),其长度为 1(i=j),或者首尾字符相同且s[i+1…j−1] 为回文串。
预处理完成之后,我们只需要 O(1) 的时间就可以判断任意 s[i…j] 是否为回文串了。

3 Python实现

class Solution:
    def partition(self, s: str) -> List[List[str]]:

        n = len(s)
        f = [[True]*n for _ in range(n)]
        for i in range(n-1,-1,-1):
            for j in range(i+1,n):
                f[i][j] = (s[i]==s[j]) and f[i+1][j-1]
        res = []
        tmp = []
        def dfs(i):
            if i==n:
                res.append(tmp[::])
                return
            for j in range(i,n):
                if f[i][j]:
                    tmp.append(s[i:j+1])
                    dfs(j+1)
                    tmp.pop()
        dfs(0)
        return res
目录
相关文章
|
28天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
1月前
|
Python
python简单分割文件的方法(python经典案例)
这篇文章介绍了两种使用Python进行文件分割的方法:通过读取指定字节数分割大文件成小文件,以及通过行数将文本文件分割成多个小文件。
44 1
|
28天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
7天前
|
Python
python知识点100篇系列(14)-分割大文件然后在合并
【10月更文挑战第2天】在工作中,因邮件附件大小限制或网络条件不佳,常需将大文件分割为小文件发送,接收后再合并。Python的文件读写功能可轻松实现此需求,也可借助第三方库filesplit简化操作。安装filesplit后,仅需几行代码即可完成文件的分割与合并,但掌握Python内置方法同样重要。
|
1月前
|
Python
Python将目录分割成数组
Python将目录分割成数组
|
2月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
21 1
|
2月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
32 0
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
50 6
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
43 4
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
99 2