题目链接
500-800ms
class Solution {
public:
int longestValidParentheses(string s) {
int result=0,k=0;
for(int j=0;j<s.length()/2;j++)
{
for(int i=0;i<s.length();i++)
{
if(s[i]=='(')
{
for(int j=i+1;j<s.length();j++)
{
if(s[j]==')')
{
s[i]='0';
s[j]='0';
break;
}
else if(s[j]=='(')
{
break;
}
}
}
}
}
for(int i=0;i<s.length();i++)
{
if(s[i]=='0')
{
result++;
}
if(s[i]!='0'){
if(result>k&&result%2==0)
{
k=result;
}
result=0;
}
}
if(result>k) return result;
else return k;
}
};
这绝不是最优解
几十毫秒之内解决问题
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> a;
int start=0,result=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='(') a.push(i);
else if(s[i]==')')
{
if(a.empty()) start=i+1;
else{
a.pop();
result=a.empty()?max(result,i-start+1):max(result,i-a.top());
}
}
}
return result;
}
};
首先思路用start记录一个子串的index,然后如果从start开始如果遇到’(‘则入栈,直至遇到’)’,这时删掉栈顶元素,直至删至一个合法子串的长度,start改变从下一个子串开始。其中result记录当前子串和上次子串的最大值。
还有一种思路DP:
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size(), maxLen = 0;
vector<int> dp(n+1,0);
for(int i=1; i<=n; i++) {
int j = i-2-dp[i-1];
if(s[i-1]=='(' || j<0 || s[j]==')')
dp[i] = 0;
else {
dp[i] = dp[i-1]+2+dp[j];
maxLen = max(maxLen, dp[i]);
}
}
return maxLen;
}
};