32. 最長有效括號
阿新 • • 發佈:2018-12-19
給定一個只包含 ‘(’ 和 ‘)’ 的字串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: “(()” 輸出: 2 解釋: 最長有效括號子串為 “()” 示例 2:
輸入: “)()())” 輸出: 4 解釋: 最長有效括號子串為 “()()”
解法一:用棧 LeetCode 20有一題是叫有效的括號,我們的思路是遇到左括號先入棧,遇到右括號,先判斷棧是否為空,如果棧為空,直接return false;如果棧不空,則出棧,繼續處理後續字元。當處理完所有字元後再判斷一次棧是否為空。這道題的思路: 1 用last標記最後一個右括號的位置,開一個棧來跟蹤沒被匹配的左括號。 2 遍歷字串,當碰到左括號,就將此刻下標壓棧,如果碰到右括號,先判斷棧是否為空,如果棧是空的,那麼將此時的下標i賦給last,如果棧不空,那麼出棧,出棧後如果棧是空的,那麼取max(maxLen, i - last),反之,取max(maxLen, i - lefts.top())
時間複雜度O(n),空間複雜度O(n)
class Solution {
public:
int longestValidParentheses(string s) {
// 用last標記最後一個“)”的位置
int maxLen = 0, last = -1;
//開一個棧用來跟蹤沒有被匹配的“(”
stack<int> lefts;
for(int i = 0; i < s.size(); i++) {
if(s[i] == '(') {
lefts. push(i);
} else {
if(lefts.empty()) {
last = i;
} else {
lefts.pop();
if(lefts.empty()) {
maxLen = max(maxLen, i - last);
} else {
maxLen = max(maxLen, i - lefts.top());
}
}
}
}
return maxLen;
}
};
解法二:動態規劃 @author (http://weibo.com/wjson) 時間複雜度:O(n),空間複雜度O(n)
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> f(s.size(), 0);
int res = 0;
for(int i = s.size() - 2; i >= 0; i--) {
int match = i + f[i + 1] + 1;
if(s[i] == '(' && match < s.size() && s[match] == ')') {
f[i] = f[i + 1] + 2;
if(match + 1 < s.size()) {
f[i] += f[match + 1];
}
}
res = max(res, f[i]);
}
return res;
}
};