题目:
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
思路:
看到有效括号,常规思路就是使用栈,遇到左括号入栈,遇到右括号出栈,返回的是有效括号子串的长度,通过往栈内压入元素下标的方法,来在后面计算长度,初始化栈的时候往里面放一个-1作为分割符,当第一个字符是左括号,入栈,第二个是右括号,出栈,栈内也不会是空的,可以用来计算长度,然后更新一下最大长度,就是用当前索引减去pop后的栈顶元素。
当第一个字符就是右括号,要执行出栈操作,如果栈初始为空就会出错,所以使用分隔符,这里把-1出栈,将右括号压入栈作为分割符,在执行出栈后,如果除分隔符外没有其他元素,就可以用来计算长度。
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
# 时间和空间都是N
if not s:
return 0
ans = 0
stack = [-1]
for i in range(len(s)):
if s[i] == '(':
stack.append(i)#存下标
else:
stack.pop()
if not stack:
stack.append(i)
else:
ans = max(ans,i - stack[-1])
return ans
# 初始化栈内有分割符,如果一开始是右括号,就将分割符替换为0,就可以计算出准确的长度