1. 程式人生 > 其它 >leetcode32. 最長有效括號(棧)

leetcode32. 最長有效括號(棧)

連結:https://leetcode-cn.com/problems/longest-valid-parentheses/

題目

給你一個只包含 '('和 ')'的字串,找出最長有效(格式正確且連續)括號子串的長度。

示例 1:

輸入:s = "(()"
輸出:2
解釋:最長有效括號子串是 "()"
示例 2:

輸入:s = ")()())"
輸出:4
解釋:最長有效括號子串是 "()()"
示例 3:

輸入:s = ""
輸出:0

提示:

0 <= s.length <= 3 * 104
s[i] 為 '(' 或 ')'

思路

方法一
用棧記錄左括號 dp陣列記錄能達到的最長合法字串

class Solution {
public:
    int longestValidParentheses(string s) {
        int n=s.size();
        if(n<2)
            return 0;
        vector<int>dp(n);
        vector<bool>iscons(n,false);
        stack<int>st;
        for(int i=0;i<n;++i){
            if(s[i]==')'){
                if(st.empty())
                    continue;
                else{
                    iscons[i]=true;
                    int t=st.top();
                    st.pop();
                    if(t>0&&s[t-1]==')'&&iscons[t-1]==true)
                        dp[i]=dp[t-1]+i-t+1;
                    else 
                        dp[i]=i-t+1;  
                }
            }else{
                st.push(i);
            }
        }
        return *max_element(dp.begin(),dp.end());
    }
};

方法二

只記錄左括號等於右括號的形式,但是特殊情況“(()”無法識別,故可以左右各進行一次,取最大

class Solution {
public:
    int longestValidParentheses(string s) {
        int n=s.size();
        int left=0,right=0,ans=0;
        for(int i=0;i<n;++i){
            if(s[i]=='(')left++;
            else right++;
            if(left==right) ans=max(ans,2*left);
            else if(right>left)left=0,right=0;   
        }
        left = 0, right = 0;
        for(int i=n-1;i>=0;--i){
            if(s[i]==')')right++;
            else left++;
            if(left==right) ans=max(ans,2*right);
            else if(left>right)left=0,right=0;   
        }
        return ans;
    }
};