leetcode -- Longest Valid Parentheses

来源:互联网 发布:淘宝的91论坛共享号 编辑:程序博客网 时间:2024/06/04 10:12

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

思路2 用dp

0 0
原创粉丝点击