如果一个括号序列中的每一个左括号都有一个右括号与之完成配对,这个序列就是一个合法的括号匹配序列。
例如:“((())),()()()”是合法的括号匹配序列,
“(((())()((()”是不合法的括号匹配序列。
牛牛得到了一系列的括号序列,牛牛要从这个系列中任意选取两个位置进行一次交换操作,仅且只能进行一次操作。牛牛想知道能否通过这次操作,把这个系列变成合法的括号匹配序列。
输入描述:
输入第一行包括测试样例数t(1<=t<=1000);
接下来t行,每行一个括号序列s(1<=length(s)<=100000),表示每个括号序列。
输出描述:
如果可以通过一次交换变成合法的括号匹配序列,则输出“YES”,否则输出“NO”
输入示例:
2
())(
)))(((
输出示例:
YES
NO
代码如下:
#include<iostraem>
#include<string>
#include<stack>
using namespace std;
const int maxn =100000;
char str[maxn];
stack<char>s;
int main()
{
int t;
cin >> t;
while (t--)
{
while (!s.empty()) s.pop();
cin >> str;
int n = strlen(str);
if (n == 2)
{
if (str[0] == '('&&str[1] == ')')
{
cout << "NO" << endl;
continue;
}
}
int i = 0;
int flag = 0;
for (i = 0; i < n; ++i)
{
if (str[i] == '(')
{
s.push('(');
}
else
{
if (!s.empty())
{
s.pop();
}
else
{
if (flag) break;
flag = 1;
s.push('(');
}
}
}
if (i == n)
{
if (!flag)
{
if (s.empty())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
else
{
if (s.size() != 2)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
结果如下: