Skip to content

题解-Atcoder-abc307d

Posted on:2023年6月25日 at 08:34

本文章遵守知识共享协议 CC-BY-NC-SA,同步发表于洛谷题解区,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博客阅读。

题意简述

给你一个含有括号的小写字母串,删除里面的所有括号对和其中的元素,让你输出删除完成后的串。

实现思路

既然遇到括号匹配,那我们大胆打一个栈上去。

别急,先别动手,因为有这样一种情况:

))a(b((c)d)

结果应该是:

))a(b

我们发现:不是所有括号都会被消除,不匹配的括号要保留。

检测到右括号时,若栈中没有左括号,那么这个右括号就不可能消去,只有这种情况要将右括号入栈,否则就将所有字符出栈直到左括号。

所以我们需要记录左括号的数量,在入栈和出栈时更新。

代码如下:

#include<stdio.h>
#include<string.h>
#include<set>
#include<algorithm>

#define maxn 200007

char ch[maxn],st[maxn];

int top,lcnt,lc,rc,t,n;

int main(){
    scanf("%d%s",&n,ch);

    for(int i=0;i<n;i++){
        if(ch[i]==')'){
            if(lcnt){
                while(st[top-1]!='(')top--;
                top--;
                lcnt--;
            }
            else
                st[top++]=')';
        }
        else
            st[top++]=ch[i],
            lcnt += (ch[i]=='(');
    }

    for(int i=0;i<top;i++)
        putchar(st[i]);

    return 0;
}


在 Rickyxrc's blog 出现的文章,若无特殊注明,均采用 CC BY-NC-SA 4.0 协议共享,也就是转载时需要注明本文章的地址,并且引用本文章的文章也要使用相同的方式共享。