Colorful Bracket Sequence

· · 题解

一个括号匹配的升级版。

维护一个栈,同时扫一遍字符串,如果当前扫到的位置为左括号就加入栈中,如果是右括号且与栈顶匹配就弹出栈顶,反之显然不成立(因为一个可以被删干净的序列必定是层层匹配的,即存在位置满足匹配的括号中间没有遮挡,在删去该匹配后仍然如此),最后输出即可。

注意在最后要查看是否栈为空。

#include<bits/stdc++.h>
using namespace std;
stack<char>st;
string s;
int check(char ch){
    if(ch=='<' || ch=='>')return 1;
    if(ch=='(' || ch==')')return 2;
    if(ch=='[' || ch==']')return 3;
}
signed main(){
    cin >> s;
    for(int i=0;i<s.size();++i){
//      cout << i;
        if(s[i]=='<' || s[i]=='(' || s[i]=='[')st.push(s[i]);
        else if(s[i]=='>' || s[i]==')' || s[i]==']'){
            if(st.size()==0 || check(s[i])!=check(st.top())){puts("No");return 0;}
            st.pop();
        }else {puts("No");return 0;}
    }
//  cout << st.siz
    if(st.size()!=0)puts("No");
    else puts("Yes");
    return 0;
}