32. Longest Valid Parentheses最长有效括号Python

给定仅包含字符'('和')'的字符串,请找到最长的有效(格式正确)括号子字符串的长度。

Input: '(()'

Output: 2  '()'长度为2

Input: ')()())'

Output: 4  '()()'长度为4

Method 1遍历所有连续的子括号,如果有效则取最大的长度(Time Limit Exceeded超时)

首先利用之前22题第二个方法判断括号是否有效的函数判断是否有效。

然后遍历连续括号,括号要限定以‘(’为开头。将括号添加到一个新的变量res中,如果满足有效括号则取之前有效括号长度和现在括号长度的最大值。

class Solution(object):
    def longest(self, s):
        length=0
        for i in range(len(s)):
            res = ''
            if s[i] == '(' or len(res) > 0:
                res += s[i]
            for j in range(i+1,len(s)):
                res+=s[j]
                if self.valid(res):
                    length=max(length,len(res))
        return length
     def valid(self,c):
        r = 0
        for _ in c:
            if _ == '(':
                r += 1
            else:
                r -= 1
            if r < 0:
                return False
        return r == 0

Method 2从左往右,从右往左遍历括号

初始化l,r代表左右括号的个数,maxlen代表最大长度。

从左往右:当遍历到的括号为‘(’时,l++;否则r++。当l=r时则证明括号匹配,取最大长度max(maxlen, 2*r);否则当r>l时证明右括号多, 不匹配, 所以l和r的值变为0重新计算

从右往左: 同理, 取最大长度时r变为l, 判断不匹配条件是l>r

最后返回最大长度。

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        l=r=maxlen=0
        for i in range(len(s)):
            if s[i]=='(':
                l+=1
            else:
                r+=1
            if l==r:
                maxlen=max(maxlen,2*r)
            elif r>l:
                l=r=0
        l=r=0
        for j in range(len(s)-1,0,-1):
            if s[j]=='(':
                l+=1
            else:
                r+=1
            if l==r:
                maxlen=max(maxlen,2*l)
            elif l>r:
                l=r=0
        return maxlen

时间复杂度O(n)遍历括号两次,空间复杂度O(1)只需要l和r的值。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值