题目:
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: “(()”
Output: 2
Explanation: The longest valid parentheses substring is “()”
Example 2:
Input: “)()())”
Output: 4
Explanation: The longest valid parentheses substring is “()()”
leetcode中有很多这种括号类的题目,这类题目的一个关键要点就是括号序列无论在哪个位置右括号的数量都不能比左括号多。从这个要点出发借助双指针就可以解决这道题目。
设left,right两个指针,分别代指子串的首尾,然后逐步向后移动right指针。我们建立一个栈stack来记录移动过程中遇到的括号,如果是(我们就将给位置入栈,如果遇到)则将栈顶元素弹出。在需要弹出时,若栈为空,代表没有与该)相对应的(,此时证明该子串无效,并将left、right移动到下一位置。若可以弹出证明有与此)匹配的(。若弹出后栈为空,证明此时子串恰好为一个有效的括号串。如果栈不为空证明子串不是有效括号串(因为有左括号没有匹配),但是从栈顶元素到right是有效的子串。具体代码如下:
def longestValidParentheses(self, s: str) -> int:
max_=0
stack_=[]
left,right=0,0
while right<len(s):
if s[right]=='(':
stack_.append(right)
right+=1
else:
if stack_==[]:
right+=1
left=right
else:
stack_.pop()
if stack_==[]:
max_=max(max_,right-left+1)
else:
max_=max(max_,right-stack_[-1])
right+=1
return max_