題目描述
給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。
示例 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%的用戶