分割回文串 II

题目描述

来源于 https://leetcode-cn.com/

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回符合要求的最少分割次数。

示例:

输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

解法:

使用动态规划,记录下在各个位置之前需要进行的划分次数。

dp[i] 就表示前 i 个字符需要划分的次数。初始状态下 dp = [-1, 0, 1, 2, ...]

对于回文串 s[start:end]dp[end+1] = min(dp[end+1], dp[start] + 1)

dp[0] = -1 可以简化状态方程的更新过程。

class Solution:
    def minCut(self, s: str) -> List[List[str]]:
        dp = [i for i in range(-1, len(s))]
        for end in range(len(s)):
            for start in range(end+1):
                if s[start:end+1] == s[start:end+1][::-1]:
                    dp[end+1] = min(dp[end+1], dp[start]+1)
                    
        return dp[-1]