[LeetCode] 32. Longest Valid Parentheses

19 篇文章 0 订阅
7 篇文章 0 订阅

最长有效括号

1. 题目描述:

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"

示例2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

2. 解题思路

这是一道动态规划问题。维护一个一维数组num,num[i]表示截止到s[i]包含s[i]的最长有效括号字符串长度。使用栈,当字符为 '('  ,其下标进栈;当字符为 ')' ,若栈空,说明该处使有效字符串中断,即num[i]=0, 否则num[i]=i-栈顶值+1+num[栈顶值-1]。

python代码:

class Solution:
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        n=len(s)
        Stack=[0 for i in range(n)]
        num=[0 for i in range(n)]
        res,tmp=0,0
        j=0
        for i in range(n):
            if s[i]==')':
                if j==0:
                    if tmp>res:
                        res=tmp;
                    tmp=0
                else:
                    num[i]=i-Stack[j-1]+1
                    if Stack[j-1]>0:
                        num[i]+=num[Stack[j-1]-1]
                    tmp=num[i]
                    if tmp>res:
                        res=tmp
                    j-=1
            else:
                Stack[j]=i
                j+=1
        return res

最关键的就是维护一位数组num,以及将 '(' 的下标入栈,而不是'(' 。

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值