LeetCode 题解工作台
分割回文串 II
给你一个字符串 s ,请你将 s 分割成一些子串,使每个子串都是 回文串 。 返回符合要求的 最少分割次数 。 示例 1: 输入: s = "aab" 输出: 1 解释: 只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。 示例 2: 输入: s = "a" 输出: 0 示例 …
2
题型
6
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
我们先预处理得到字符串 的每一个子串 是否为回文串,记录在二维数组 中,其中 表示子串 是否为回文串。 接下来,我们定义 表示字符串 的最少分割次数,初始时 。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = "aab" 输出:1 解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
示例 2:
输入:s = "a" 输出:0
示例 3:
输入:s = "ab" 输出:1
提示:
1 <= s.length <= 2000s仅由小写英文字母组成
解题思路
方法一:动态规划
我们先预处理得到字符串 的每一个子串 是否为回文串,记录在二维数组 中,其中 表示子串 是否为回文串。
接下来,我们定义 表示字符串 的最少分割次数,初始时 。
接下来,我们考虑 如何进行状态转移。我们可以枚举上一个分割点 ,如果子串 是一个回文串,那么 就可以从 转移而来。如果 ,那么说明 本身就是一个回文串,此时不需要进行分割,即 。因此,状态转移方程如下:
答案即为 ,其中 是字符串 的长度。
时间复杂度 ,空间复杂度 。其中 是字符串 的长度。
class Solution:
def minCut(self, s: str) -> int:
n = len(s)
g = [[True] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
for j in range(i + 1, n):
g[i][j] = s[i] == s[j] and g[i + 1][j - 1]
f = list(range(n))
for i in range(1, n):
for j in range(i + 1):
if g[j][i]:
f[i] = min(f[i], 1 + f[j - 1] if j else 0)
return f[-1]
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | complexity is O(n^2) due to filling the palindrome table and updating dp for each substring. Space complexity is O(n^2) for the table and O(n) for dp, optimizing lookups for state transitions in dynamic programming. |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
They may ask if you can precompute palindrome substrings to speed up checks.
- question_mark
Expect questions about how to handle overlapping subproblems efficiently.
- question_mark
They often probe understanding of the dp state definition and transitions.
常见陷阱
外企场景- error
Failing to precompute palindromic substrings leads to TLE for longer inputs.
- error
Incorrect dp initialization can cause off-by-one errors in cut counts.
- error
Assuming single-pass greedy partitioning works ignores overlapping subproblems.
进阶变体
外企场景- arrow_right_alt
Return all possible palindrome partitions instead of the minimum cuts.
- arrow_right_alt
Handle strings with uppercase letters or special characters in palindrome checks.
- arrow_right_alt
Compute minimum cuts for palindromic substrings of a fixed maximum length.