32. 最长有效括号

Posted digdig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了32. 最长有效括号相关的知识,希望对你有一定的参考价值。

我的代码居然过了。。

class Solution:
    def expand(l,s):
        r = False
        for item in l:
            left = item[0]
            right = item[1]
            if left>=1 and s[left-1]==‘(‘ and right+1<len(s) and s[right+1]==‘)‘:
                item[0] -= 1
                item[1] += 1
                r = True
        return r
    def merge(l):
        if len(l)<=1:
            return l
        for i in range(1,len(l)):
            if l[i][0]-l[i-1][1]==1:
                l[i][0] = -1
                l[i-1][1] = -1
        nl = []
        for item in l:
            nl.extend(item)
        nl = [i for i in nl if i!=-1]
        l = [nl[i:i+2] for i in range(0,len(nl),2)]
        return l

    def longestValidParentheses(self, s: str) -> int:
        if len(s)==1:
            return 0
        l = []
        for i in range(1,len(s)):
            if s[i-1]==‘(‘ and s[i]==‘)‘:
                l.append([i-1,i])
        if len(l)==0:
            return 0
        while True:
            l = Solution.merge(l)
            #print(‘merge‘,l)
            r = Solution.expand(l,s)
            #print(‘expand‘,l)
            if not r:
                break
        l = [i[1]-i[0]+1 for i in l]
        return max(l)

 我的思路就是模拟,括号肯定是一层一层的,所以我就从最里面一层开始,慢慢往外拓展(expand),如果拓展不了,说明就这些了。然后找到最大的区间就好了。

我的思路基本跟暴力差不多,所以性能很差。

这道题的题目描述有点问题。“找出最长的包含有效括号的子串的长度”容易让人误解,这里的子串实际上指的是连续子串。

看官方题解,给了三种方法。分别是dp,栈和贪心。这三种我都没怎么看懂。。

把链接放下面,什么时候想起来了再去研究研究 https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/

不过第一个dp我觉得解释的似乎有点问题。dp[i]定义的是到i结尾的字符串的最长有效括号的长度。

但是我用题解的代码,跑测试样例"())()",得到的dp数组为0,2,0,0,2

一共五个括号,中间那个括号,按照dp数组的定义,不应该是2嘛。这里我没相同,是题解有问题还是我没理解对?

以上是关于32. 最长有效括号的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 32.最长有效括号

LeetCode 32. 最长有效括号c++/java详细题解

leetcode 32: 最长有效括号

Leetcode(32)-最长有效括号

32. 最长有效括号

32. 最长有效括号