Longest Valid Parentheses

Longest Valid Parentheses

動態規劃

思路一(未實現):

從右端開始遍歷,尋找 '(' 到末尾所構成的最大長度,根據存儲的dp數組跳躍判斷


思路二(python實現):

類似思路一,只不過遍歷的時候不找全局最大,而是局部最大,類似貪心,存儲之後再返回計算

具體過程如下:

) ( ) ( ( ( ) ) ( ( ( ) ( ) ) )

0121112411121268

第一行爲給定的字符串,第二行爲計算時存儲的dp數組

從左側開始遍歷,遇到 '(' 就存儲 1 ,遇到 ')' 的時候判斷:

前一個數是1,則存儲2(代表這個右括號構成了一個長度爲2的合法括號對)

如果前一個數是0,說明前面爲一個非法的右括號,那麼當前位置也非法(前面沒有左括號匹配了),也存儲0

如果前一個數大於1,記爲n,說明前面是匹配好的右括號,而且長度爲n,這時查看再向前n步的位置的值,是0,1,還是大於1,重複上面步驟

如果一直大於1,則循環,否則,如果遇到0,則該位置存儲0,遇到1,那麼該位置存儲一共跳過的位置再加2(此時該位置的右括號再遠處找到了可以匹配的左括號)

遍歷結束後得到上面的dp數組

這時開始計算最大值:

從後面開始遍歷,遇到大於1的值,說明這一段連續的括號已經匹配,計入臨時遍歷count,此時遊標向前跳該值那麼多步(跳轉到這段合法的括號前面一個位置)

如果遇到的還是大於1的值,循環尋找,並加入count

知道遇到1或者0,說明該段合法的括號與再前面的不構成更長的匹配括號,此時的count與ans比較,ans中存儲較大者,count清零,遊標前移一位,繼續尋找,直到數組開頭


例子(加粗爲遊標位置):

0121112411121268

count = 8  ans = 8


0121112411121268

count = 12  ans = 12


0121112411121268

count = 0  ans = 12


0121112411121268

count = 2  ans = 12


0121112411121268

count = 0  ans = 12

最終得到最大值爲12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章