[LeetCode] 32. Longest Valid Parentheses

最长有效括号

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,以及将 ‘(‘ 的下标入栈,而不是'(‘ 。

以上。

点赞