杭电 5831

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

猜你喜欢

转载自blog.csdn.net/nucyangjiayun/article/details/52191752
今日推荐