题意:求出最长连续的规范括号序列,并求出长度和个数
方法一:利用栈与括号特性,来一发dp,本着一个左括号与一个右括号对应,是左括号就入栈,否则寻找栈中与其相匹配的并计算距离;
方法二:从左到右扫一遍,标记合法右括号,从右到左扫一遍,标记合法左括号。再对标记数组扫一遍,如果vis[i]=1;,ans++;
否则ans=1;(玄学正确性)
详看代码操作
dp AC代码:
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stack>
using namespace std;
const int maxn=1e6+10;
int dp[maxn];
stack<int>s;
int main()
{
string st;
cin>>st;
memset(dp,0,sizeof(dp));
for (int i=0;i<st.length();i++)
{
if (st[i]=='(')
s.push(i);
else
{
if (!s.empty())
{
int po=s.top();
s.pop();
if (po)
dp[i]=dp[po-1]+(i-po+1);
else
dp[i]=dp[0]+(i-po+1);
}
}
}
int maxx=0,cnt=0;
for (int i=0;i<st.length();i++)
{
if (dp[i]>maxx)
{
maxx=dp[i];
cnt=1;
}
else if (dp[i]==maxx)
cnt++;
}
if (maxx==0)
cout<<"0"<<" "<<"1"<<endl;
else
cout<<maxx<<" "<<cnt<<endl;
return 0;
}