#include <iostream>
#include <algorithm>
#include <stack>
#include <cstdio>
using namespace std;
const int M=100100;
char s[M];
stack <char> sta;
int main()
{
int t;
cin>>t;
while(t--)
{
while(!sta.empty()) sta.pop();
int n;
cin>>n;
scanf("%s",s);
if(n==2)
{
if(s[0]=='('&&s[1]==')') //必须要交换一次
{
puts("No");
continue;
}
}
bool flag=false;
int i;
for(i=0;i<n;i++)
{
if(s[i]=='(')
sta.push('(');
else
{
if(!sta.empty())
sta.pop();
else //如果棧空碰到 ')' 因为允许交换一次 则'}'->'('压入 最后如果成功 则棧剩下的是两个 '((' 也就是 '){'变化来
{
if(flag) break;
else
{
flag=true;
sta.push('(');
}
}
}
}
if(i==n)
{
if(!flag)
{
if(sta.empty())// 本身就匹配且长度大于2 则随便交换相同的即可
{
puts("Yes");
}
else
{
puts("No"); //'(' 个数多于')'
}
}
else
{
if(sta.size()==2)
{
puts("Yes");
}
else
{
puts("No");
}
}
}
else //有两个以上的前导')'
{
puts("No");
}
}
return 0;
}
hdu 5831 栈+模拟
最新推荐文章于 2017-07-19 12:49:41 发布