@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("(())((()"))