算法-动态规划-最长有效括号

该文章介绍了一个解决字符串中最长有效括号子串问题的算法。通过动态规划方法,计算每个位置上能形成的最长有效括号子串的长度,考虑括号的重叠和并行两种形式。代码示例使用了Python实现,分析了不同情况下的处理策略,包括边界条件和括号匹配的检查。
摘要由CSDN通过智能技术生成

32. 最长有效括号

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例: 

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
输入:s = ""
输出:0

思路分析

注意有效括号通常有两种形式:

重叠形式:((...xx...))

并行形式:(...xx....)(...xx....)

dp[i]表示跟第i个字符组成的有效子串长度

dp[0]组不成有效串,为0

1,若"(" dp[i]=0 截止当前字符,无法组成有效子串,

2,若")" 分情况查看前面字符:

   2.1,若前面字符是"(":

dp[i-2]+2

dp[i-2]前i-2个串的有效子串长度:dp[i-2]加上当前有效的"()"

   2.2,若前面字符是")" :

  可能组成 "((xxx))" 则判断s[i-1-dp[i-1]]的字符是不是预期中的"(",若是的话则当前 dp[i-1]+2 。注意,也可能是这样的:"(xxx)((xxx))",还要加上可能存在的红色部分。

dp[i]=dp[i-2-dp[i-1]]+dp[i-1]+2 

注意!边界情况的判断! 

代码

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        n=len(s)
        if n<=1:
            return 0
        dp=[0]*n
        for i in range(1,n):
            if s[i]=="(":
                dp[i]=0
            else:
                #a==")"
                if s[i-1]=="(":
                    dp[i]=dp[i-2]+2 if i>=2 else 2
                if s[i-1]==")":
                    print("i=%s"%(i))
                    dp[i]=dp[i-2-dp[i-1]]+dp[i-1]+2 if i-1-dp[i-1]>=0 and s[i-1-dp[i-1]]=="(" else 0
                    #dp[i-2-dp[i-1]]+dp[i-1]+2 类似于(s1)((s2)) s2长度+s1长度
                
            print("dp[%i]=%s"%(i,dp[i]))
        return max(dp)
                       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值