题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5831
题目大意:给出一些括号,在必须交换两个括号的位置的前提下字符串依然合理为Yes,否则为No。
题解:从前往后遍历,当遇到第一次’)‘的个数大于’(‘时,把’)‘换成’(‘,此后如果再有’)‘的个数大于’(‘,便是No。不要忘记特判!!
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[100005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,i;
scanf("%d",&n);
scanf("%s",s);
int sum1=0,sum2=0,sum3=0,sum4=0,flag=0;
if(n%2!=0)
{
printf("No\n");
continue;
}
if(n==2&&s[0]=='('&&s[1]==')')
{
printf("No\n");
continue;
}
int flag2=0;
for(i=0;i<n;i++)
{
if(s[i]=='(')
{
sum1++;
sum3++;
}
else if(s[i]==')')
{
sum2++;
sum4++;
if(sum2>sum1&&flag2==0)
{
flag2=1;
sum1++;
sum2--;
}
}
if(sum2>sum1)
flag++;
if(flag==1)
break;
// cout<<flag<<endl;
}
if(sum3!=sum4)
printf("No\n");
else if(flag<1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}