一.首先看右括号和问号的数量是否一致,若不一致则再往下进行计算
二.左括号肯定在右括号的前面,所以先放置左括号再放置右括号
三.在判断问好是否可以进行改变
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
while(cin>>t){
while(t--){
string s;
cin>>s;
int z=0,w=0;//z为括号的数量,w为问号的数量
for(int i=0;i<s.length();i++){
if(s[i]=='('){
z++;
}
else if(s[i]==')'){//若有右括号必有它的左括号,相互抵消
z--;
}
else{
w++;
}
}
//如果问好的数量刚好等于右括号的数量,只有一种可能所以直接输出yes
if(w==abs(z)){
cout<<"YES"<<endl;
continue;
}
//左右括号组合的数量
int ans=(w-z)/2;
bool f=false;//先变成左括号,再变成右括号,
for(int i=0;i<s.length();i++){
if(s[i]=='?'){
if(ans>1){
s[i]='(';
ans--;
}
else if(ans==1){
if(f){
s[i]='(';
ans--;
}
else{
s[i]=')';
f=true;
}
}
else{
s[i]=')';
}
}
}
// for(int i=0;i<s.length();i++){
// cout<<s[i];
// }
// cout<<endl;
int cnt3=0;
int flag=0;
for(int i=0;i<s.length();i++){
if(s[i]=='('){
cnt3++;
}
else {
cnt3--;
}
if(cnt3<0){//小于零的话代表有可以活动的括号,所以输出YES
cout<<"YES"<<endl;
flag=1;
break;
}
}
if(!flag){
cout<<"NO"<<endl;
}
}
}
return 0;
}