符合二叉树的形式。
先判断括号是否能够全部配对。然后再去建树,最外面的括号为根节点。最后判断每个节点的子树数量是否小于等于2即可。
如何建树?左边有几个左括号分类,这个在匹配的时候是可以记录的。
#include <bits/stdc++.h>
#define endl '\n'
using ll = long long;
typedef unsigned long long ull;
using namespace std;
void GordenGhost();
signed main() {
#ifdef Gorden
freopen("in.txt", "rt", stdin);
freopen("out.txt", "wt", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _;
cin>>_;
while (_--)
GordenGhost();
return 0;
}
void GordenGhost() {
string s;
cin>>s;
stack<int>w;
map<int,int>mp;
for (int i = 0; i < s.size(); ++i) {
if (s[i]=='('){
w.push(i);
}
else{
if (w.size()&&s[i]==')'){
w.pop();
if (w.size()){
mp[w.top()]++;
if (mp[w.top()]>2){cout<<"NO"<<endl;return;}
}
}
}
if (w.empty()&&i!=s.size()-1){cout<<"NO"<<endl;return;}
}
if (w.size()){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
}
}