动态规划解法,dp[i]表示以i为开始的最长有效括号字符串的长度,
只有以'('开始有可能出现有效括号串,对于每一个'('来说,要凑出一个有效的括号字符串 肯定是'('+一段有效的括号字符串+')' +一段有效的括号字符串
#include<iostream>
using namespace std;
const int MAXN = 1e5+10;
int main()
{
string s;
cin >> s;
int ans = 0;
int dp[MAXN]={0};
for(int i = s.length()-2 ; i >= 0 ; i--)
{
if(s[i]=='(')
{
int next = i+dp[i+1]+1;//去掉左括号+一段有效的括号字符串之后的位置
if(next <s.length() && s[next]==')')//+')'
{
dp[i] = dp[i+1]+2;
if(next+1 <s.length()){dp[i]+=dp[next+1];}//加后面的一段有效的括号字符串
}
}
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}栈解法:顺序遍历字符串,对于每一个字符来说,如果是'('就入栈,如果是')'并且栈顶是'(',那就出栈,并且记一下当前的长度。
#include<iostream>
#include<stack>
using namespace std;
struct node{
char c;
int index;
};
const int MAXN= 1e5+10;
int main()
{
string s;
cin >> s;
stack<node> S;
int ans = 0;
for(int i = 0 ;i < s.length();i++)
{
if(s[i]==')'&&!S.empty()&&S.top().c=='(')
{
S.pop();
int b = 0;
if(!S.empty()){ans = max(ans,i-S.top().index);}
else{ans = i+1;}
}
else{S.push(node{s[i],i});}
}
cout<<ans<<endl;
return 0;
}
京公网安备 11010502036488号