leetcode -- Longest Valid Parentheses

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

你可能感兴趣的:(LeetCode)