题目链接
英文链接:https://leetcode.com/problems/palindrome-partitioning-ii/
中文链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/
题目详述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
1 | 输入: "aab" |
题目详解
动态规划。
- 类似于 LeetCode5-最长回文子串,可以采用从中心向两边扩展,分为奇数长度和偶数长度两种情况。
- 定义
f[i]
表示将s[0, i]
分割成回文串的最少分割次数,容易知道最差情况每个字符当作一个回文串,则f[i] = i
。 - 从小到大枚举回文串的中心,从中心向两边扩展,在这个过程中进行状态转移。
- 如果
s[i, j]
为回文串,则f[j]
可以由f[i - 1]
转移得到。f[j] = min(f[j], f[i - 1] + 1)
,需满足i > 0
;若i == 0
,说明不需要分割,f[j] = 0
。
1 | public class LeetCode_00132 { |
- 另一种动态规划的方法,一共进行两次动态规划。
- 第一次动规:计算出每个字串是否是回文串。
- 状态
c[i][j]
表示s[i, j]
是否为回文串。 - 转移方程:
s[i, j]
为回文串当且仅当s[i] == s[j]
并且s[i + 1, j - 1]
为回文串。 - 边界情况:如果
s[i, j]
的长度小于等于2,则c[i][j] = s[i] == s[j]
。
- 状态
- 第二次动归,同上。
1 | public class LeetCode_00132 { |