力扣 32. 最長有效括號 思維\棧

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

在這裏插入圖片描述

思路一:初始置cur=ct=0cur=ct=0,如果遇到((,就令curctcur、ct自增,否則令curcur自減,ctct自增,那麼當cur=0cur=0時說明當前子串匹配了,我們可以令ans=max(ans,ct)ans=max(ans,ct),但是當cur<0cur<0時說明當前子串已經沒有意義了,所以需要把curctcur、ct都置爲00。但是這樣處理不了((()((()這樣的情況,所以還需要反着處理一遍。

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

思路二:用棧來實現,把每個((的下標壓進去,當碰到))的時候,通過下標之差計算答案。但是像()()()()這種情況就很難處理,我們考慮初始時加入一個1-1作爲邊界,先彈出棧頂,再計算差值,這樣也能得到正確答案。需要注意的是,如果彈出棧頂後棧爲空,說明在這一步之前的括號已經完成匹配了,所以這個時候不能計算貢獻,應該把當前座標ii壓進去作爲新的邊界。

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> stk;
        stk.push(-1);
        int siz=s.size(),ans=0;
        for(int i=0;i<siz;i++)
        {
            if(s[i]=='(')
                stk.push(i);
            else
            {
                stk.pop();
                if(stk.empty())//前面已經配對完了
                    stk.push(i);
                else
                    ans=max(ans,i-stk.top());
            }
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章