leetcode:分割回文串之二(python)

1. 题目描述

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

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

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

2. 思路

如果返回所有可能的分割结果,在计算最少分割数,会超时。因此采用动态规划。dp[i]表示前i+1个字符构成的字符串所需要的最少分割数。
动态规划的数组初始化为dp[i] = i,0<= i < len(s)。当s[j:i+1]是回文串的时候,dp[i] = min(dp[i],dp[j-1] + 1)(找到在前i+1个字符中,最小的分割次数)。当整个字符串是回文串时,直接返回0

2.1 python代码

class Solution:
    def minCut(self, s: str) -> int:
        if s == "" or len(s) == 0:
            return 0
        n = len(s)
        dp = [i for i in range(n)]
        for i in range(1,n):
            if self.isPalindrome(s[:i+1]):  # 如果前i+1个字符就是回文串,就不用分割了
                dp[i] = 0
            else:
                for j in range(i+1):    # 不断找可能的分割点
                    if self.isPalindrome(s[j:i+1]):
                        dp[i] = min(dp[i],dp[j-1] +1)  # 不断找最小的分割次数
        return dp[-1]
        
    def isPalindrome(self,s):   # 判断是不是回文串
        if s != s[::-1]:
            return False
        return True

猜你喜欢

转载自blog.csdn.net/ggdhs/article/details/91351573