问题 A: 括号匹配2019

题目描述

w222222s发现了一个由’(‘和’)'组成的环,他想知道如果将环从某处断开,得到的序列有没有可能让括号能够匹配。比如环"))((“可以拆成”))((" “())(” “(())” ")(()“四种,其中”(())"的括号就能够匹配,另外三种则不能。
请你帮他设计一个程序,可以知道,由括号组成的环能不能得到一个可以匹配的序列。

输入

输入有多行。
每行都有一个由’(‘和’)‘组成的字符串,表示由’(‘和’)'组成的环。
所有字符串的长度的和不超过100000

输出

对于每一行所表示的环,判断能不能得到可以括号匹配的序列,如果有输出"YES",否则输出"NO"。

样例输入
))((

样例输出
YES

注意
1.输入有多行
2.a.substr(n,m),截取a字符串的第n到m位(从第0位开始算)
3.注意括号匹配判断的写法

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string a,temp,top;
    int sum=0;
    while(cin>>a)
    {
        int sign=1;int flag=1;
        int l=a.size()+50;
        temp=a;
        while(l--)///将前面的括号往后面放,重复l次
        {
            sign=1;sum=0;
            //cout<<temp<<endl;
            for(int i=0; i<temp.size(); i++)///判断在这个组合中括号是否匹配,注意判断的方式
            {
                //cout<<111<<endl;
                if(temp[i]=='(')  {sum++;}///左括号,sum+1,入栈
                else
                {
                    if(sum>0)   sum--;    ///右括号,sum--,弹栈(栈不为空的前提下)
                    else{ sign=0; break; }///sum<0,栈为空,括号不匹配,继续向下一种组合形式判断
                }
            }
            if(sign==1&&sum==0)///sum==0的条件不能漏
                {cout<<"YES"<<endl; flag=0;break;}///括号匹配
            temp=temp.substr(1,temp.size())+temp[0];///将temp的第一个字符移到最后一个,注意substr的用法
            //cout<<temp<<endl;
        }
        if(flag==1) cout << "NO" << endl;
        a.clear();
        temp.clear();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值