LeetCode-python 32.最长有效括号

题目链接
难度:困难       类型: 字符串、动态规划


给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例1

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"

示例2

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

解题思路


方法1:(动态规划)
dp[i]表示以第i个字符结尾的有效括号的最长长度
对于( )(( ))
i=4: dp = [0,2,0,0,2,0]
i=5: dp = [0,2,0,0,2,6]
dp[5] = 2 + dp[5-dp[5-1]-2]
解释:dp[i] 和dp[i-1]有关,还和dp[i-dp[i-1]-2]有关,没有第5位的‘)’时, 第2位的‘(’把0-4的字串分成了两端有效括号,但有了第5位的‘)’时,激活了这两段之间的连接,使之形成一整段有效括号

状态转移方程:
当s[i] == '(':dp[i] = 0
当s[i] == ')',并能找到前半个‘(’:
dp[i] = dp[i-dp[i-1]-2] + 2+ dp[i-1]

代码实现

方法1:(动态规划)

class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        max_len = 0
        len_s = len(s)
        dp = [0]*len_s
        for i in range(1,len_s):
            if s[i] ==')':
                if i-dp[i-1]-1>=0 and s[i-dp[i-1]-1]=='(':                  
                    dp[i] = dp[i-dp[i-1]-2] + 2+ dp[i-1]
                    max_len = max(max_len, dp[i])            
        return max_len

本文链接://www.greatytc.com/p/3cc0d3d17a25

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: ...
    河海中最菜阅读 256评论 0 0
  • 0. 动态规划分析 0.1 动态规划、递归和贪心算法的区别 动态规划就是利用分治思想和解决冗余的办法来处理问题,所...
    dreamsfuture阅读 7,501评论 2 6
  • 1.01背包 题目描述 有 n 个重量个价值分别为 w_i, v_i 的物品。从这些物品中选出总重量不超过 W 的...
    一只可爱的柠檬树阅读 457评论 0 2
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,433评论 0 2
  • 昨天是执行师课程的第二天,在课程中我认识了自己的应该如此,认识了自己的局限性信念,在画一比四线九点的时候,我有了更...
    love小幸福阅读 125评论 0 0