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

【LeetCode】32. 最長有效括號

題目描述

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

示例 1:

輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"

示例 2:

輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"

思路

用棧 p 儲存還未匹配的 ( 的下標,flag 用來標記 ( 的位置;

當 s[ i ] 為 ( 時,直接入棧,為 ) 時,若棧為空,flag = i + 1,前面的都作廢;

匹配 ( 後,若棧為空, 求長度,要加 1!

程式碼

class Solution {
public:
    int longestValidParentheses(string s) {
        int res = 0;
        int n = s.size();   
        stack<int> p;
        int flag = 0;
        for(int i=0; i<n; i++){
            if(s[i] == '('){
                p.push(i);
            }else{
                if(p.empty())
                    flag = i + 1;
                else{
                    p.pop();
                    if(p.empty())
                        res = max(res, i-flag+1);
                    else
                        res = max(res, i-p.top());
                }
            }
        }
        return res;
    }
};