• 【leetcode】132. Palindrome Partitioning II


    题目如下:

    解题思路:本题是【leetcode】131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用【leetcode】131. Palindrome Partitioning的方法把所有解的都求出来取最小值肯定会超时。对于求最大/最小值的题目,大多数情况下都是用动态规划的方法。首先创建dp数组,其长度等于输入字符串s的长度+1,dp[i]表示s[0:i]子串可以划分的最少的回文子串的个数,然后令dp[i]=i (i 是dp[i]最大值,例如输入s= 'abcd',除了单个字符本身之外无任何回文,dp[i] = i)。那么可以得到递推表达式:dp[i] = min(dp[i],dp[j]+1) (0 <j < i && s[j:i]是回文子串)。这样可以得出代码一,提交后发现超时,究其原因,应该多次调用isPalindrom的原因。那么是否可以把isPalindrom的结果存储起来呢?当然可以,继续引入Is_Palidrom[][],令Is_Palidrom[j][i]等于s[j:i]是否回文。那么优化后的判断回文的表达式变成:s[j] == s[i] &&  Is_Palidrom[j + 1][i - 1] (需满足: j+1 > i-1)。这样得到代码二。

    代码一如下:

    class Solution(object):
        def isPalindrom(self,s):
            return s == s[::-1]
        def minCut(self, s):
            """
            :type s: str
            :rtype: int
            """
            dp = [i for i in xrange(len(s)+1)]
            for i in xrange(len(s)):
                for j in xrange(i):
                    if self.isPalindrom(s[j:i+1]):
                        dp[i+1] = min(dp[i+1],dp[j]+1)
                #
                dp[i+1] = min(dp[i+1],dp[i] + 1)
            #print dp
            return dp[-1] - 1

    代码二如下:

    class Solution(object):
        def minCut(self, s):
            """
            :type s: str
            :rtype: int
            """
            t = [False] * (len(s)+1)
            Is_Palidrom = []
            for i in range(len(s)+1):
                Is_Palidrom.append(t[:])
            for i in range(len(s)+1):
                Is_Palidrom[i][i] = True
    
            dp = [i for i in xrange(len(s)+1)]
            for i in xrange(len(s)):
                for j in xrange(i):
                    if s[i] == s[j]:
                        if j+1 > i-1:
                            Is_Palidrom[j][i] = True
                            dp[i+1] = min(dp[i+1],dp[j]+1)
                        else:
                            if Is_Palidrom[j + 1][i - 1] == True:
                                Is_Palidrom[j][i] = True
                                dp[i + 1] = min(dp[i + 1], dp[j] + 1)
    
                #
                dp[i+1] = min(dp[i+1],dp[i] + 1)
            #print dp
            #print Is_Palidrom
            return dp[-1] - 1
    
            
  • 相关阅读:
    老调重弹之整除与实数除
    #define 预处理指令(C++,C#,VB.NET)
    char类型和string类型(C++,C#)
    使用XPATH对XML数据进行解析
    SQL Server查询优化之:使用提示(Hints)
    XSLT几种应用场景
    在C++中定义常量的两种方法的比较
    为SSIS编写自定义任务项(Task)之高级篇
    利用反射绑定事件处理程序(C#)
    自定义打开Reflector的方式
  • 原文地址:https://www.cnblogs.com/seyjs/p/9407372.html
Copyright © 2020-2023  润新知