給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: 「(()」
輸出: 2
解釋: 最長有效括號子串為 「()」
示例 2:
輸入: 「)()())」
輸出: 4
解釋: 最長有效括號子串為 「()()」
這是一道動態規劃題目,但是確實不好想。如果用暴力做法,需要o(n^3)的時間複雜度。
陣列f表示狀態陣列,f[i]表示必須以第i個字元結尾的字串,其中最長的有效括號長度(必須包含第i個字元)。如果第i個字元為』(』,那麼以第i個字元結尾的字串,最長的有效括號長度就是0,這是最簡單的情況。
如果第i個字元為』)』,那麼需要看i前面的字元。就是需要統計f[i-1]的長度,f[i-1]表示i-1個字串結尾的最長有效括號的長度,設為l,那麼如果第i-l-1個字元恰好為『(』,說明此時從i-l-1位置到i位置正好是乙個有效括號,但是此時還沒結束,還需要統計f[i-l-1-1]的值,也就是第i-l-1個字元的前面那個字元j,以第j個字元結尾的最長有效括號的長度。
如果那麼如果第i-l-1個字元恰好為『)』,則第i-l-1個字元與第i個字元無法匹配。那麼f[i]就是0。
時間複雜度為o(n)。非常巧妙
public
intlongestvalidparentheses
(string s)
int max_l =0;
int f=
newint
[n];
f[0]
=0;for
(int i=
1;i)else}}
max_l = math.
max(max_l,f[i]);
}return max_l;
}
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...
32 最長有效括號
題目.high 字串首先想到dp,以第n個數為結尾的最大括號數,要麼是前面n 1的最大括號數,要麼是一第n個數結尾的括號數 package main import fmt func endlongerst s string int else if rights 0 return pairs func...