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, 重新開始統計
這樣得到的可能是(((((), 但是由於左括號數量大於右括號的數量, 所以我們錯誤地認爲它是合理的, 這時我們需要倒序遍歷一遍即可