https://leetcode-cn.com/problems/longest-valid-parentheses/
思路一:初始置,如果遇到,就令自增,否則令自減,自增,那麼當時說明當前子串匹配了,我們可以令,但是當時說明當前子串已經沒有意義了,所以需要把都置爲。但是這樣處理不了這樣的情況,所以還需要反着處理一遍。
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;
}
};
思路二:用棧來實現,把每個的下標壓進去,當碰到的時候,通過下標之差計算答案。但是像這種情況就很難處理,我們考慮初始時加入一個作爲邊界,先彈出棧頂,再計算差值,這樣也能得到正確答案。需要注意的是,如果彈出棧頂後棧爲空,說明在這一步之前的括號已經完成匹配了,所以這個時候不能計算貢獻,應該把當前座標壓進去作爲新的邊界。
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;
}
};