杭电 5831

来源:互联网 发布:华东理工网络大学 编辑:程序博客网 时间:2024/06/08 01:01

题目链接: 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;}

0 0
原创粉丝点击