力扣刷题笔记:132. 分割回文串 II(动态规划,逐行代码注释,主要是好理解一些,其他题解根本看不懂。。。)

题目:

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/

猜你喜欢

转载自blog.csdn.net/weixin_44414948/article/details/114535591