力扣32 最長有效括號

2021-10-07 19:42:07 字數 2357 閱讀 6496

32. 最長有效括號

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

示例 1:

輸入: "(()"

輸出: 2

解釋: 最長有效括號子串為 "()"

示例 2:

輸入: ")()())"

輸出: 4

解釋: 最長有效括號子串為 "()()"

這是道困難題,看到了括號,我第一想到的就是棧,因為對於匹配括號的題,棧這種資料結構是非常好用的。其次最長有效,這幾個字在動態規劃題目中經常遇見,所以不妨兩者都可以考慮對應解法

我們假設dp陣列表示以當前字元作為結尾,其能匹配的括號長度

舉個例子

index: 0 1 2 3 4 5

括號: ( ( ( ( ) )

dp陣列:0 2 0 0 2 4

我們假設當前dp[i] 是i = 4的情況,那麼如何推斷出dp[i+1]?

首先我們可以知道括號匹配時,其結尾一定是右括號,此時我們條件判斷時當結尾為右括號才判斷

其次,如果前面已經有匹配的括號,我們自然要跳過

比如index=5前面有了index=4匹配的括號,我們需要加上前面這個匹配的,即加上dp[-1],而另外一點,與index=5匹配的括號肯定不在index=4匹配括號的範圍內,因此我們需要跳過,即跳過i - dp[i-1] - 1

此時如果s[i-dp[i-1]-1] 為左括號時,則匹配成功,加2

最後我們還要考慮s[i-dp[i-1]-1]前面是否有匹配,即加dp[i-dp[i-1]-2]

最後狀態轉移公式為:dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2

這些情況可能會導致陣列越界,因此我們還需要額外判斷使得索引在陣列範圍內

下面是python**

class solution:

def longestvalidparentheses(self, s: str) -> int:

"""動態規劃

初始化乙個全0的dp陣列

代表以改字元結尾的括號長度

:param s:

:return:

"""n = len(s)

if n == 0:

return 0

dp = [0]*n

for i in range(len(s)):

if s[i] == ')' and i - dp[i-1] - 1>=0 and s[i-dp[i-1]-1] == '(':

dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2

return max(dp)

index: 0 1 2 3 4 5 6

括號: ( ) ) ( ( ) )

我們先往棧裡放入-1

棧:-1
我們是將陣列的索引入棧,當是左括號的時候,就將索引入棧,如果是右括號,則出棧,將當前索引與棧頂元素相減,得到length

並且維護乙個最大長度max_length

一開始index=0是左括號,入棧

棧 :-1 0
然後index = 1是右括號,出棧,此時棧裡只剩-1,而1 - (-1) = 2,記為length

棧:-1
index = 2是右括號,相對於分割了子串,將-1出棧,此時棧裡面沒有元素,將 2 入棧

棧:2
index = 3, 4都是左括號,入棧

棧:2 3 4
index = 5 是右括號,將4出棧,此時 5 - 3 = 2

棧: 2 3
類似推導得出最後為4

下面是**

def longestvalidparentheses2(self, s: str) -> int:

"""使用棧

:param s:

:return:

"""stack = [-1]

length = 0

max_length = 0

for i in range(len(s)):

if s[i] == '(':

else:

stack.pop()

if stack == :

else:

length = i - stack[-1]

max_length = max(max_length, length)

return max_length

力扣刷題 32 最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。動態規劃初步 動態規劃可以理解為是一種遞迴的思想,當前的狀態可以由之前已知的狀態推導過來 用數學表示即 f x 可以由f x 1 或者f x 2 的某種關係得到。一般來講,目標是求什麼則什麼即為狀態,然後分析當前狀態和之前狀態的推導關係...

力扣 32 最長有效括號 思維 棧

思路一 初始置cur ct 0cur ct 0 cur ct 0,如果遇到 就令cur ctcur ct cur ct 自增,否則令cur curcu r自減,ctct ct自增,那麼當cur 0cur 0 cur 0時說明當前子串匹配了,我們可以令ans max ans ct ans max an...

力扣解題思路 32 最長有效括號 糾錯記錄

思路 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。輸入 輸出 2 解釋 最長有效括號子串為 輸入 輸出 4 解釋 最長有效括號子串為 這一題和22.括號生成類似,首先想到的是用棧來解決,先看一下我的錯誤 int count 0 stack stack newstack for i...