您的位置:首页 > 其它

leetcode -- Longest Valid Parentheses

2015-12-22 17:18 691 查看
https://leetcode.com/problems/longest-valid-parentheses/

思路1 stack

思路:注意这里是要找的是最长的parenthese的substring,而不是所有匹配的括号有多少对。参考/article/4981630.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


思路2 用dp

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: