昨天自己做出来了,然后在网上百度了下发现有更巧妙的方法,这里记录一下。
参考博客:https://blog.youkuaiyun.com/renjiewen1995/article/details/51193746
先贴代码:
class Solution:
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
maxLen = 0
lefts = []
for index,ch in enumerate(s):
if ch == ')' and len(lefts) !=0 and s[lefts[len(lefts)-1]] == '(':
lefts.pop()
if len(lefts) == 0:
maxLen = index+1 #因为栈里没有异常点,说明全部匹配成功,所以就是当前index+1
else:
if index - lefts[len(lefts)-1] > maxLen :#这里栈顶永远是最近的异常点
maxLen = index - lefts[len(lefts)-1]
else:
lefts.append(index)
return maxLen
if __name__ =="__main__":
res = Solution()
#'(()()(((((((())))))))'
print(res.longestValidParentheses(")()())()()("))
pass
这位老哥将异常点压入栈中,每次遍历都会计算当前子串的长度,即上一个异常点后的子串长度。
为什么说栈顶永远是最近的异常点呢?因为异常点一旦压入栈中就永远不会出栈,所以每一次右括号匹配到左括号就会重新计算子串长度。