1. 程式人生 > >32. 最長有效括號

32. 最長有效括號

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

示例 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;
    }
};