链接:https://codeforces.com/problemset/problem/1709/C
题意:给出一个合法的括号序列然后把其中一些位置变为?,问是否存在多种填法使得填出的序列是个合法且独一无二的括号序列。
思路:1.遇到'(',sum++;2.遇到),sum--;3.遇到?,问号数数量存储cnt++;
通过计数的方式来进行括号的匹配,最后sum就代表没被匹配的且确定的左括号或者说最少要有的左括号,那么剩下的cnt就当做')'与未匹配的进行匹配,所以最后从cnt = sum 就是得到的答案
AC代码:
#include <bits/stdc++.h>
void solve(){
std::string s;
std::cin >> s;
int sum = 0, cnt = 0;
for(char c:s){
if(c == '(') sum++;
else if(c == ')')
if(sum) sum--;
else cnt--;
else cnt++;
if(sum == 0 && cnt == 1) cnt--,sum++;
}
if(cnt == sum) std::cout << "YES\n";
else std::cout << "NO\n";
}
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int T;
std::cin >> T;
while(T--){
solve();
}
return 0;
}