Leetcode——32.最长有效括号【##】


@author: ZZQ
@software: PyCharm
@file: leetcode32_最长有效括号.py
@time: 2018/11/22 19:19

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

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

思路:

     1)max_len 用于记录当前匹配最长的括号长度。
     2)s_dict用来存储遇到的左括号的下标。
     3)start存储有效的起始下标。
     4)遇到左括号,下标入栈
     5)遇到右括号,a.如果此时s_dict为空,则更新start的值
                 b. 否则,s_dict栈顶元出栈,此时,
                        b.1.如果是栈为空,记录当前匹配到的子串长度【i到start之间的距离,包含start】i-start+1,更新max_len的值;
                        b.2.如果栈非空,后面可能还会继续匹配,先记录当前匹配到的子串长度【i到栈顶元素下标之间的距离】i-s_dict[-1],更新max_Len的值。

AC代码如下:

class Solution():
    def __init__(self):
        pass

    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        s_len = len(s)
        max_len = 0
        s_dict = []
        i = 0
        start = 0
        while i < s_len:
            if s[i] == '(':
                s_dict.append(i)
            else:
                if len(s_dict) == 0:
                    i += 1
                    start = i
                    continue
                else:
                    s_dict.pop()
                    if len(s_dict) == 0:
                        max_len = max(max_len, i-start+1)
                    else:
                        max_len = max(max_len, i-s_dict[-1])
            i += 1
        return max_len


if __name__ == "__main__":
    answer = Solution()
    print(answer.longestValidParentheses("(())((()"))
posted @ 2018-11-23 14:31  恩zzq我是  阅读(149)  评论(0编辑  收藏  举报