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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值