leetcode打卡 Longest Valid Parentheses
阿新 • • 發佈:2018-12-18
題目
Given a string containing just the characters'('
and')'
, find the length of the longest valid (well-formed) parentheses substring.
大意就是:給定一個只包含 '('
和 ')'
的字串,找出最長的包含有效括號的子串的長度。
示例1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
示例2
Input: ")()())" Output: 4 Explanation: The longest valid parentheses substring is "()()"
注:類似(())
也是有效匹配,長度為4
分析
該題在leetcode動態規劃的分類下,所以我們可以使用動態規劃來解決該問題。我們可以使用一個數組arr來記錄字串s在下標i
的位置時,其有效長度為多少。
- 當
s[i] == '('
, arr[i] = 0 - 當
s[i] == ')'
,需要分兩種情況來討論- 當
s[i-1]=='('
時,很明顯arr[i] = arr[i-2] + 2
,因為此時有效子串的長度多增加了一對括號()
,即有效子串長度+2 - 當
s[i-1]==')'
時。考慮這樣的情況,假設sub ="((......))"
是給定字字串的一部分,且為有效子串。那麼arr[i]的值為sub字串的長度
sub前一個下標(記為
j)的對應的arr的值
,即arr[i] = len(sub) + arr[j
]。那麼sub的長度和j該如何計算呢?我們仔細觀察一下,因為sub是有效子串,所以len(sub) = arr[i-1] + 2
,j = i - arr[i-1] - 2
。(這樣強行解釋一波不知道行不行得通
- 當
程式碼
class Solution {
public:
int longestValidParentheses(string s) {
if(s.size() == 0) {
return 0;
}
int max = 0;
int arr[s.size()] = {0};
for(int i = 0; i < s.size(); ++i) {
if(s[i] == ')' && i > 0) {
if(s[i-1] == '(') {
arr[i] = i >= 2 ? arr[i-2] + 2 : 2;
}
else if(i - arr[i - 1] > 0 && s[i - arr[i - 1] - 1] == '(') {
arr[i] = arr[i-1] + (i - arr[i-1] -2 >= 0 ? arr[i - arr[i-1] -2]:0) + 2;
}
}
if(arr[i] > max) {
max = arr[i];
}
}
return max;
}
};