题解:ABC283D - Scope
·题目
链接:Atcoder。
链接:洛谷。
·难度
算法难度:B。
思维难度:B。
调码难度:C。
综合评价:普及-。
·算法
模拟+栈。
·思路
用一个栈来实现括号匹配(实际上栈不用建立出来,只需要记录一个top即可,因为就算是建出来里面也只有左小括号),并用d数组维护每个字母在几层括号内出现过并且未被删除(其实就是放置时的top,它的初始值均为-1,表示没出现过)。
具体操作:
①左括号:top++。
②右括号:将所有为top的d[i]设为-1,并top--。
③其他字母:若对应的d不是-1就表示会晕倒,否则将对应的d设为top。
·代价
O(|s|)。
·细节
正常做就行。
·代码
#include<bits/stdc++.h>
#define S 330000
using namespace std;
int d[26]={},top=0;
char str[S]={};
int main(){
memset(d,-1,sizeof(d));
//初始化d为-1
scanf("%s",str+1);
int l=strlen(str+1);
for(int i=1;i<=l;i++){
if(str[i]=='('){
top++;
//左括号:模拟入栈,top++
}else{
if(str[i]==')'){
for(int j=0;j<26;j++){
if(d[j]==top){
d[j]=-1;
}
}
top--;
//右括号:删除所有d[i]为top的点(将d[i]设为-1),并模拟出栈,top--
}else{
if(d[str[i]-'a']!=-1){
//判定该球原来是否出现过,出现过输出No并退出
printf("No\n");
return 0;
}
//更新d[]的值
d[str[i]-'a']=top;
}
}
}
printf("Yes\n");
//没有晕倒输出Yes
return 0;
}
·注意
Yes和No注意不要弄反。