https://leetcode.com/problems/longest-valid-parentheses/
思路1 stack
思路:注意这里是要找的是最长的parenthese的substring,而不是所有匹配的括号有多少对。参考http://www.cnblogs.com/zuoyuan/p/3780312.html
这里考虑几个情况:
)))))()()
())))))()()
(((())))
分别讨论就能理解下述代码
class Solution:
# @param s, a string
# @return an integer
def longestValidParentheses(self, s):
maxlen = 0
stack = []
last = -1
for i in range(len(s)):
if s[i]=='(':
stack.append(i) # push the INDEX into the stack!!!!
else:
if stack == []:#记住valid parentheses的开始index,例如一开始都是右括号,last会记住最后面那个右括号。last这里也可以看做linkedlist中的dummy node。这里用以应付'()()'这样的case
last = i#记录valid substring的开始index,因为对于()()这样的case,当遇到第二个右括号的时候,last还是0.
else:
stack.pop()
if stack == []:#当右括号,遇到stack里面最后一个左括号,即s中第一个左括号的时候,这个左括号肯定是valid parentheses substring的第一个字符,所以,要减去last,如果s的第一个字符是左括号,那么就相当于maxlen + 1,因为maxlen一直存的是substring len - 1
maxlen = max(maxlen, i-last)
else:#如果一开始就有很多左括号,那么stack[len(stack) - 1]就是这个valid substring parentheses的开头
maxlen = max(maxlen, i-stack[len(stack)-1])
return maxlen
这里要特别注意,下面的思路是不对的,只用scan到的i减去stack的top index,然后+1. 因为无法handle ‘()()’这种case,所以还是要像上面的code一样。用一个last来记录一个valid parenthess substring的开始index。
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
maxlen = 0
stack = []
last = -1
for i in range(len(s)):
if s[i]=='(':
stack.append(i) # push the INDEX into the stack!!!!
else:
if stack == []:
continue
else:
last = stack.pop()
maxlen = max(maxlen, i-last+1)
return maxlen