感觉自己宛如一个智障。。。
维护一个栈,dp保证相邻的合法括号能够相连接,就好了。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1001000;
char s[MAXN];
int dp[MAXN];
stack<int> stk;
int main()
{
int len,i,ans,sum,tmp;
while(scanf("%s",&s)!=EOF)
{
len=strlen(s);
memset(dp,0,sizeof(dp));
while(!stk.empty())
stk.pop();
ans=0;
for(i=0;i<len;i++)
{
if(s[i]=='(')
stk.push(i);
else if(!stk.empty())
{
tmp=stk.top();
stk.pop();
dp[i]=dp[tmp-1]+i-tmp+1;
if(dp[i]>ans)
{
ans=dp[i];
sum=1;
}
else if(dp[i]==ans)
sum++;
}
}
if(ans)
printf("%d %d\n",ans,sum);
else
printf("0 1\n");
}
}

本文介绍了一种使用栈和动态规划方法来解决寻找字符串中最长的有效括号子串及其数量的问题。通过遍历输入字符串并利用栈记录左括号的位置,结合动态规划计算最长有效括号长度。
941

被折叠的 条评论
为什么被折叠?



