1. 程式人生 > >[LeetCode] 32. Longest Valid Parentheses

[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,以及將 '(' 的下標入棧,而不是'(' 。

以上。