直接开个栈,遇到左括号把左括号的位置入栈
那么遇到右括号位置是 i i i的时候,把栈顶的一个左括号 j j j取出来
那么说明 [ j , i ] [j,i] [j,i]一定是合法的
所以可以进行 d p dp dp
d p [ i ] = ( i − j + 1 ) + d p [ j − 1 ] dp[i]=(i-j+1)+dp[j-1] dp[i]=(i−j+1)+dp[j−1]
因为 [ j , i ] [j,i] [j,i]位置的前面可以接上以 j − 1 j-1 j−1结尾的最长合法串
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
int n,a[maxn],ans,num,dp[maxn],q[maxn],top;
char s[maxn];
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
{
if( s[i]=='(' ) dp[i]=0,q[++top]=i;
else
{
if( top ) dp[i] = dp[q[top]-1]+( i-q[top--]+1 );
else dp[i] = 0;
}
if( dp[i]>ans ) ans=dp[i],num=1;
else if( dp[i]==ans ) num++;
}
if( ans==0 ) num=1;
cout << ans << " " << num;
}