32 最長有效括號 (棧)

2021-09-26 07:45:44 字數 1902 閱讀 4255

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

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