原题链接:Leecode 32. 最长有效括号
参考Leecode官方题解:最长有效括号
好题好题,妙啊!
解法一:栈
class Solution {
public:
int longestValidParentheses(string s) {
if(s.size()==0)
return 0;
int res=0;
stack<int> st;
st.push(-1);
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
st.push(i);
else
{
st.pop();
if(!st.empty())
res=max(res,i-st.top());
else
st.push(i);
}
}
return res;
}
};
解法二:动态规划
class Solution {
public:
int longestValidParentheses(string s) {
if(s.size()==0)
return 0;
int res=0;
vector<int> dp(s.size()+1);
for(int i=1;i<s.size();i++)
{
if(s[i]==')')
{
if(s[i-1]=='(')
dp[i]=(i-2>=0 ? dp[i-2] : 0)+2;
else if(i-dp[i-1]-1>=0 && s[i-dp[i-1]-1]=='(')
{
dp[i]=dp[i-1]+2+(i-dp[i-1]-2>=0 ? dp[i-dp[i-1]-2]:0);
}
res=max(res,dp[i]);
}
}
return res;
}
};
解法三:不需要额外的空间
class Solution {
public:
int longestValidParentheses(string s) {
if(s.size()==0)
return 0;
int res=0,l=0,r=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
l++;
else
r++;
if(l==r)
res=max(res,r*2);
else if(r>l)
l=r=0;
}
l=r=0;
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]=='(')
l++;
else
r++;
if(l==r)
res=max(res,r*2);
else if(l>r)
l=r=0;
}
return res;
}
};