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...