1. 程式人生 > >LEETCODE NO.32 Longest Valid Parentheses 詳細解答

LEETCODE NO.32 Longest Valid Parentheses 詳細解答

先來看一下問題描述 

分析: 

1.考慮用棧來進行輔助,每次遇'('進行入棧,當遇')'時進行判斷,如果棧非空,那麼將棧頂元素所對應序號處的'('對應為當前遇到的')'(也就是說我們首先找到了離得最近的滿足條件的左右括號,後續判斷的時候從最短距離兩端進行擴充套件判斷),這樣我們就建立了合法括號的座標對應關係

2.遍歷進行判斷,如果發現當前的位置是有對應關係的(只有在'('的時候我們建立了關係,有非初始值),那麼我們這時候分兩種情況來考慮

(1)出現的是(())這樣的情況,最長長度是4,很顯然,我們這時候需要處理直到對應關係全部解決為止,因此需要while迴圈

(2)出現的是()()這樣的情況,最長長度仍然是4,雖然這時候直接dp一次取最大值即可,但為了和(1)中的進行統一處理,我們同樣考慮用while迴圈,只是這時候只進行一次罷了。

那麼可以寫出程式碼:

class Solution {
public:
    int longestValidParentheses(string s) {
        vector<int> dp(s.length(),-1);
        stack<int> Stack;
        int res=0;
        for(int i=0;i<s.length();i++){
            if(s[i]=='(')
                Stack.push(i); //左括號的座標,為了後續的對應關係
            else{
                if(!Stack.empty()){ //只有當棧非空的時候,我們建立座標對應
                    dp[Stack.top()]=i;
                    Stack.pop();
                }
            }
        }
        for(int i=0;i<dp.size();i++){
            if(dp[i]!=-1){
                int idx=i;
                int len=0;
                while(idx<dp.size() && dp[idx]!=-1){
                    len+=dp[idx]-idx+1;
                    idx=dp[idx]+1;//完事了我們直接看右括號之後的下一項
                }
                res=max(res,len);
            }
        }
        return res;
    }
};