Leetcode---32. 最長有效括號---每日一題

32. 最長有效括號

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

示例 1:

輸入: “(()”
輸出: 2
解釋: 最長有效括號子串爲 “()”

示例 2:

輸入: “)()())”
輸出: 4
解釋: 最長有效括號子串爲 “()()”

思路

        左右各自遍歷一次,不使用額外空間,空間複雜度爲O(1),時間複雜度爲O(n),有一個特別注意的點就是重置計數器,例如:從左到右遍歷優先要’(’,若’(‘的數目還少於’)’,那麼需要重置計數器爲0。從右到左遍歷也是一個道理。

實現代碼

class Solution {
public:
    int longestValidParentheses(string s) {
        int len = s.size(), left = 0, right = 0, match = 0;
        // 從左到右遍歷
        for(int i = 0; i < len; i++){
            if(s[i] == '(') ++left;
            else{
                ++right;
                if(left == right) match = max(match, left << 1);
                // 若右括號數目過多,不符合題意,重置計數器
                if(right > left) right = 0, left = 0;
            }
        }
        // 從右到左遍歷,重置計數器
        left = 0, right = 0;
        for(int i = len - 1; i >= 0; i--){
            if(s[i] == ')') ++right;
            else{
                ++left;
                if(left == right) match = max(match, left << 1);
                // 與上面同理
                if(left > right) right = 0, left = 0;
            }
        }
        return match;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章