LEETCODE NO.32 Longest Valid Parentheses 詳細解答
阿新 • • 發佈:2018-12-25
先來看一下問題描述
分析:
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; } };