问题建模
给定一个括号序列,该序列满足两个定义
1. ( ) ∈ B 1.(\quad)∈B 1.()∈B
2. x , y ∈ B , ( x ) ( x y ) ∈ B 2. x,y∈B,(x)(xy)\in B 2.x,y∈B,(x)(xy)∈B
问给定的括号序列是否匹配该定义
问题分析
将一对括号视为树上的一个结点,一个结点最多有两个子节点,该定义符合二叉树的定义,则可以用栈来模拟二叉树 的构建过程,同时在去进行括号匹配的检测。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=3e5+10;
int ch[N];
void solve(){
string str;
cin >>str;
int n=str.size();
int cnt=0;
int res=0;
memset(ch,0,(n+1)*sizeof(int));
for(int i=0;i<n;i++){
if(str[i]=='('){
res++;
cnt++;
}
else {
res--;
if(res<0) break;
ch[cnt]++;
if(ch[cnt]>2) break;
ch[cnt+1]=0;
cnt--;
}
}
if(res!=0) puts("NO");
else if(!(cnt==0&&ch[1]==1)) puts("NO");
else puts("YES");
}
int main(){
int t;
cin >>t;
while(t--) solve();
return 0;
}