题目链接
题意
给你一系列的有‘(’、‘)’组成的字符串,其中的数据量不大,问经过一次交换其中两个字符的位置能否使所有的括号都能符合题意给出的规范(也就是配对).
解题思路
可以用堆栈来模拟括号配对。当所有的括号都压栈或弹出后检查栈中剩下的不配对的括号是否多于4个。如果多于四个就不能经过一次操作后符合规范。 因为一次交换操作只能最多将4个不符合规范的括号调整为符合规范。然后就是些细节处理.(如果输入的左右括号数量不想等是不可能符合规则的,我是默认数据为相等的)
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
stack<char> s;
int tt;
cin >> tt;
int n;
string p;
while(tt--)
{
cin >> n;
cin >> p;
for(
int i =
0; i < n; i++)
{
if(p[i] ==
'(')
s.push(p[i]);
else {
if(s.size() >
0 && s.top() ==
'(')
s.pop();
else {
s.push(p[i]);
}
}
}
if( n%
2 ==
1||n <
2 || s.size() >
4)
cout <<
"No" << endl;
else if(n ==
2 && s.size() ==
0)
cout <<
"No" << endl;
else cout <<
"Yes" << endl;
while(s.size())
s.pop();
}
}