cf打卡第三天(呜呜呜今天周赛加给22管周赛好忙qwq)
题目意思:一个字符只由 ’(‘ , ’)‘ 和 ’ ?‘组成,?可能是’(‘或者’)‘,问你这个序列有没有多种正确的括号序列(题目数据保证至少有一种)。
思路:因为要问的是 是不是只有一种正确的序列,那么我们可以记录左括号右括号和问号的数量,
每次碰到右括号时,就左括号减减(因为一定有一个正确的括号序列),如果左括号为0就减去问号的数量,如果是左括号为0但是问号只有一个的情况下,那就需要把问好转换为左括号(不可能是右括号吧),
然后最后判断剩下的左括号于问号是否相等,如果是就是证明只有一种情况,如果不相等就说明有不止一种情况~
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int N=300000+100;
int n ,m,h;
char s[N];
int main()
{
cin>>n;
while(n--)
{
cin>>s+1;
int l=0,r=0,sum=0;//左括号,右括号,问号
int pan=0;//如果只有一中情况
for(int i =1;i<=strlen(s+1);i++)
{
if(s[i]=='(')l++;
else if(s[i]==')'){
if(l)l--;
else sum--;
pan=1;
}
else if(s[i]=='?')
sum++;
if(l==0&&sum==1) sum--,l++;
}
if(l!=sum)cout<<"NO\n";//有多种情况
else cout<<"YES\n";
}
return 0;
}
今天写的有点赶,下次再补这道再总结一下!!