leetcode 32 最长有效括号 O(N)时间解法

题目:

给一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的有效(正确关闭)括号子串的长度。

对于 “(()”,最长有效括号子串为 “()” ,它的长度是 2。

另一个例子 “)()())”,最长有效括号子串为 “()()”,它的长度是 4。

链接:
https://leetcode-cn.com/problems/longest-valid-parentheses/description/

思路:
构造一个栈,通过压栈出栈的方式判断字符串中每个括号的匹配情况。以字符“()(()”为例,这里匹配出来的结果是 11022也就是说前面两个是用11表示的是一对匹配的括号,而用22表示的是另一对匹配的括号。这里,将22换成11并不影响最后对最长的判断,我们只要在这个新得出的数组里面找到连续的就行了,能保证有正确的0分割点就可以通过上面的字符串计算出最长的长度的 。

代码:

class Solution:
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        stack = []
        tmp = [0 for _ in range(len(s))]
        for (i, ch) in enumerate(s):
            if ch == ')':
                if len(stack) == 0:
                    stack.append((ch, i))
                else:
                    if stack[-1][0] == '(':
                        ele = stack.pop()
                        tmp[ele[1]] = 1
                        tmp[i] = 1
                    else:
                        stack.append((ch, i))
            else:
                stack.append((ch, i))

        max_counter = 0
        counter = 0
        for v in tmp:
            if v == 0:
                counter = 0
            else:
                counter += 1
                if counter > max_counter:
                    max_counter = counter
        return max_counter

s = Solution()
print(s.longestValidParentheses('(())'))
print(s.longestValidParentheses('()(()'))

你可能感兴趣的:(算法)