題意
給你一系列的有‘(’、‘)’組成的字符串,其中的數據量不大,問經過一次交換其中兩個字符的位置能否使所有的括號都能符合題意給出的規範(也就是配對).
解題思路
可以用堆棧來模擬括號配對。當所有的括號都壓棧或彈出後檢查棧中剩下的不配對的括號是否多於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();
}
}