题目:
132、分割回文串 II
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
示例 2:
输入:s = “a”
输出:0
示例 3:
输入:s = “ab”
输出:1
提示:
1 <= s.length <= 2000
s 仅由小写英文字母组成
注:和131题很像,但用回溯发会超时。。。
题解思路:
这题有点复杂,滑窗时可能会出现新的不定长回文串,所以需要使用动态规划进行分割次数的更新,具体实现方法见代码注释。
题解python代码:
class Solution:
def minCut(self, s: str) -> int:
l = len(s)
f = [i for i in range(l)] # 前i个元素最少的分割次数
for i in range(l):
for j in range(i+1): # 对于第i个元素,遍历之前的所有组合进行判断
tmp = s[j:i+1] # 构建子串
if tmp==tmp[::-1]: # s[j:i+1]是回文
if j==0: f[i] = 0 # j==0 说明[:i+1]的子串是回文串,切割线移至i+1,之前不需要再分割
# 更新 i 字符位置的分割次数,新的分割线为 j,即 j 之前的分割次数再加上1,则f[i]更新为f[j-1]+1
else: f[i] = min(f[i],f[j-1]+1)
return f[-1]
作者:a-qing-ge
链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/dong-tai-gui-hua-xiang-xi-zhu-shi-by-a-q-r5ts/
来源:力扣(LeetCode)https://leetcode-cn.com/problems/palindrome-partitioning-ii/