給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"
示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"
【困難】
題意是找到最長的連續有效括號:如s="()(()",有效的連續括號只有(),答案應該是2.
一開始理解錯了,以為是要求所有有效括號的總長度。。。。
【分析】利用棧。遍歷s:
1遇到"("時
,將左括號標壓入棧內
2遇到")"時
:
注1. 當s="(()))"
時,為了統一計算length
,設棧內初始元素為-1.
舉個例子,做差值的思路其實相當於:
在棧彈出1之後,遇到了3,彈出0,棧頂元素為-1,此時length=3-(-1)
.差值相當於在[當前遍歷的最右端的右括號]和[有效連續的最左端括號]之間建立了聯絡。
class solution(object):
def longestvalidparentheses(self, s):
""":type s: str
:rtype: int
"""stack=[-1]
length_max=0
i=0while ilength_max:
length_max=length
else:
i+=1
return length_max
【分析2】不需要額外空間。left
記錄左括號的個數,right
記錄右括號的個數
注:上述是從左往右遍歷。但是,這道題,還需要從右往左按相同的原理再遍歷一遍。因為s="(()" 時從左往右不能能正確記錄長度,因為left
始終小於right
,此時需要從右往左遍歷。
class solution(object):
def longestvalidparentheses(self, s):
""":type s: str
:rtype: int
"""length_max=0
left,right=0,0
#左→右
for i in range(len(s)):
if s[i]=="(":
left+=1
else:
right+=1
if left==right:
length=2*left
if length>length_max:
length_max=length
elif leftlength_max:
length_max=length
elif left>right:
left,right=0,0
return length_max
【分析3】 LeetCode 32 最長有效括號(棧)
難度 困難 這道題與leetcode 20.有效的括號類似,leetcode20要求的是找出字串是否是有效的括號,我們利用的是模擬乙個棧的方法以及刪除法。這道題是來求最長有效括號,刪除法就行不通了,但是我們仍然可以使用棧的方法來解決。棧 c 模擬乙個棧的結構,將字元挨個壓入棧中,如果字元匹配則彈出資...
32 最長有效括號
給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2 解釋 最長有效括號子串為 示例 2 輸入 輸出 4 解釋 最長有效括號子串為 class solution return res dp i 表示以當前位置為終點的最長長度,則只能在 處更新,如果s i 1 dp...
32 最長有效括號
給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。輸入 輸出 2 解釋 最長有效括號子串為 輸入 輸出 4 解釋 最長有效括號子串為 示例沒有說明,其實 也是有效的,答案為4 class solution def longestvalidparentheses self,s str i...