【力扣】32:最長有效括號 | hard

題目描述

給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。

示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串爲 "()"

示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串爲 "()()"

算法思路

分析題目,很容易可以知道一點,給定字符串一定是由有效括號字符串無效字符拼接起來的。

反過來看,給定字符串就是被許多無效字符隔開的有效括號串,我們要求的就是被分割的字符串中的最長的那個。

有了這個思路,但是一直卡着沒辦法實現,
在這裏插入圖片描述
評論區這位大佬給了我思路,嘿。

我們如何知道哪些左括號是多餘的?遍歷一遍後剩下的就是多餘的,只要入棧的是左括號的ID,那麼最後我們就知道哪些是多餘左括號了。

算法

class Solution:
    def longestValidParentheses(self, s: str) -> int:

        # ls:棧,用來進行括號匹配
        # lst:列表,用來保存多餘右括號的位置
        ls,lst=[],[]

        # 遍歷一遍s
        for i,j in enumerate(s):
            # 將所有左括號的ID入棧
            if j=='(':
                ls.append(i)
            else:
                # 對右括號,如果此時ls爲空,那麼這個右括號就是多餘的,放入lst
                # 否則就是有效的右括號,與棧中左括號ID抵消
                if ls:
                    ls.pop()
                else:
                    lst.append(i)

        # 將所有的阻隔合併排序並添加上左右邊界
        c=[-1]+sorted(ls+lst)+[len(s)]
        MAX=0

        # 最後遍歷阻隔數組,計算差值既是所求值
        for i in range(len(c)-1):
            MAX=max(MAX,c[i+1]-c[i]-1)
        return MAX

執行用時:52 ms, 在所有 Python3 提交中擊敗了87.15%的用戶
內存消耗:14.4 MB, 在所有 Python3 提交中擊敗了11.11%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章