最長有效括號

2021-10-02 14:17:31 字數 2472 閱讀 4030

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

示例 1:

輸入: 「(()」

輸出: 2

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

示例 2:

輸入: 「)()())」

輸出: 4

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

class solution:

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

def test(temp1):

left2=0

right2=0

for j in temp1:

if j=='(':

left2+=1

else:

right2+=1

if left2max_len :

max_len=len(temp1)

return max_len

這道題一開始我的思路,是先遍歷一遍比如遍歷到i時我們就來尋找以s[i]為結尾的有效括號子串的長度。

剛開始我尋找的思路是對以s[i]結尾的子串進行兩道排查

1.首先在前面我統計了「(」和「)」的個數,分別為left和right,然後我們在該字串不停的踢出串首字元,同時記錄left和right

2.當他們相等時我們需要進行第二道判斷,即從頭讀取一遍該刪減過的字串看看是否會出現left int:

n=len(s)

dp=[0]*n

max_len=0

for i in range(n):

if s[i]=='(':

dp[i]==0

elif i-dp[i-1]-1==0and s[0]=='(':

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

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

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

if dp[i]>max_len:

max_len=dp[i]

return max_len由於上一種方法的時間複雜度不符合要求,我們倆用時間換空間,我的想法是當我們遍歷到i時我們要判斷以s[i]為串尾的有效字串的長度時,我們可以利用之前儲存的j"("那麼肯定不存在以s[i]結尾的有效子字串

如果是s[i]")"

我們發現公式dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]

而當 i-dp[i-1]-1==0時由於dp[i-dp[i-1]-2]不存在所以單獨考慮,但由於dp[-1]等於零後來我又把他們這兩種情況結合到了一起

class solution:

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

n=len(s)

dp=[0]*n

max_len=0

for i in range(n):

if s[i]==')':

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

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

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

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

if dp[i]>max_len:

max_len=dp[i]

return max_len

class solution:

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

n=len(s)

dp=[0]*n

max_len=0

for i in range(n):

if s[i]==')':

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

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

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

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

if dp[i]>max_len:

max_len=dp[i]

return max_len

還有一種思路是,建立乙個棧然後進行遍歷,假如s[i]"(",則在棧中記錄乙個點位等待「)」與其配對

如果s[i]")「那麼我們需要從棧中將與s[i]最近的記錄的點刪除,表示這之間是有效括號子串,並且記錄該長度。

由於假如s[i]")"我們就需要從棧中踢出乙個與其對應的點,而當棧中沒有與其對應的點的時候即stack為空的時候我們就無法踢出元素了或者假如前面所有的「(」都被消耗完了,這時候我們找不到乙個標準來計算出i與最近刪除的點之間的長度,wile解決這個問題我們設定乙個初始的量度-1

還有當我們stack中只剩下-1而且是s[i]」)"那麼我們需要將-1踢出並且使i成為新的那個量度因為不存在以「)」開頭的有效括號。

最長有效括號

leedcode32 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2解釋 最長有效括號子串為 示例 2 輸入 輸出 4解釋 最長有效括號子串為 思路 首先生成乙個長度和s一樣的陣列dp,dp i 表示以i結尾的字元的最長有效括號子串長度。顯然dp 0 0 假...

最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2解釋 最長有效括號子串為 示例 2 輸入 輸出 4解釋 最長有效括號子串為 思路 解法1 借助棧 借助棧來求解,需要定義個start變數來記錄合法括號串的起始位置,我們遍歷字串,如果遇到左括號,則將當前下標壓入棧...

最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。輸入 輸出 2 解釋 最長有效括號子串為 輸入 輸出 4 解釋 最長有效括號子串為 用陣列dp i 表示括號串s i 結尾的最大括號字串長度。當 s i 是 時,dp i 一定為0。當s i 為 時,判斷s i 1 是否為 s i 1 ...