题意
给出一个括号的序列,求最长的合法的子序列。
思路
用一个变量
l
l
l,记录
(
(
(的数量,表示需要匹配的左括号数量。碰到一个
)
)
),如果l>0,
a
n
s
+
+
ans++
ans++,
l
−
−
l--
l−−.
说明左括号匹配成功,需要匹配的左括号数量减少一个。
代码
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
using namespace std;
const int N=1e6+10;
const int M=2023;
const int inf=0x3f3f3f3f;
char a[N];
int n;
int l,r,ans;
int main()
{
scanf("%s",a);
n=strlen(a);
for(int i=0;i<n;i++)
{
if(a[i]=='(')l++;
if(a[i]==')')
{
if(l)
{
l--;
ans++;
}
}
}
cout<<ans*2;
return 0;
}