python leetcode 132. Palindrome Partitioning II

思路:如果s[left:right]是回文并且s[:left]也是回文,那么s[:right]即是一个分割。同理如果dp[left:right]是最小回文分割并且dp[:left]也是最小回文分割,那么dp[:right]=dp[left:right]+dp[:left]。为了方便遍历,这里将dp[left:right]设置为1即s[left:right]是回文。为了减少运行时间,增加一个判断s[left:right]是否是回文序列的二维数组。

class Solution(object):
    def minCut(self, s):
        """
        :type s: str
        :rtype: int
        """
        #p[j][i] 判断j-i是否是回文序列 dp[i]0~i的最少分割 
        ls=len(s)
        dp=[0]*(ls+1)
        dp[0]=-1
        p=[[False]*ls for i in range(ls)]
        for i in range(ls):
            dp[i+1]=i
        for i in range(ls):
            for j in range(i+1):
                if s[j]==s[i] and ((i-j<2) or p[j+1][i-1]):
                    p[j][i]=True 
                    dp[i+1]=min(1+dp[j],dp[i+1])
        return dp[ls] 

猜你喜欢

转载自blog.csdn.net/Neekity/article/details/84987098