LeetCode32 最長有效括號

LeetCode 32. 最長有效括號

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

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

        left, right, maxlen = 0, 0, 0
        # left 代表左括號的個數, right代表右括號的個數
        # 從左到右遍歷
        for char in s:
            if char == '(':
                left += 1
            else:
                right += 1

            if left == right: # 是合理的 
                maxlen = max(maxlen, 2 * right)
            elif right > left:  # 不合理, 且最後遍歷的是右括號, 不可能是後面子串的開始, 所以兩者直接設置爲0
                left, right = 0, 0
        
        # 從由到左遍歷 因爲如果是 (()的情況從左邊是得不到最大長度的
        left, right = 0, 0
        for char in s[::-1]:
            if char == ')':
                right += 1
            else:
                left += 1

            if left == right:
                maxlen = max(maxlen, 2 * left)
            elif right < left:
                left, right = 0, 0
        return maxlen

遍歷每個字符後, 統計一個左括號和右括號的個數, 只要右括號大於左括號的個數, 那就是不合理的, 並且剛遍歷的一個字符肯定是右括號, 所以直接將他們的個數設置爲0, 重新開始統計

這樣得到的可能是(((((), 但是由於左括號數量大於右括號的數量, 所以我們錯誤地認爲它是合理的, 這時我們需要倒序遍歷一遍即可

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