给出一个长度为 n 的,仅包含字符 ‘(’ 和 ‘)’ 的字符串,计算最长的格式正确的括号子串的长度。
例1: 对于字符串 “(()” 来说,最长的格式正确的子串是 “()” ,长度为 2 . 例2:对于字符串 “)()())” , 来说, 最长的格式正确的子串是 “()()” ,长度为 4 .
字符串长度:0≤n≤5∗10
5
输入格式:
只由’(’ 和 ‘)’ 组成的字符串。
输出格式:
输出最长的合法括号子串的长度。
输入样例:
)()())
输出样例:
4
一个精巧的模拟,技巧是:下标入栈,而不是符号入栈。
#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
typedef long long ll;
const int N=1e5+10;
string a;
stack<int>s;
int main()
{
cin>>a;
int ans=0;
for(int i=0;a[i];i++)
{
if(s.size()&&a[i]==')'&&a[s.top()]=='(')//匹配
{
//则可以更新答案
s.pop();
if(s.size()) ans=max(ans,i-s.top());
else ans=max(ans,i+1);//i从0开始
}
else s.push(i);
}
cout<<ans;
return 0;
}