题目描述
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;
}