洛谷P1241 括号序列

P1241

题目说的模模糊糊,样例又太过简单没起作用,在猜出题人意思,阅读理解属于是

大致意思是,从左往右扫,扫到右括号时,检测其左边第一个未匹配的左括号,匹配这两就匹配了,给这两打个标记,不匹配就继续扫

读进来从左往右扫一遍,是左括号就压入栈,是右括号就检测左边第一个未匹配的左括号(其实就是栈顶),不匹配直接过,匹配就两个都打一下标记,然后出栈

比较麻烦的地方在,怎么给匹配的左括号打标记,懒得想直接用指针解决了,然后本来标记是打算简单+1的,但是 '(' + 1 好像会变成 ')'

输出时候从左往右扫一遍,不匹配的就手动匹配,匹配的直接输出就行

#include<cstdio>
#include<cstring>
using namespace std;

const int N = 105;

char s[N];
char* q[N];

int main(){

    scanf("%s", s);
    int len = strlen(s);

    int top = 0;

    for(int i = 0; i < len; ++i){
        if(s[i] == '(' || s[i] == '[') q[++top] = &s[i];
        else{
            if(s[i] == ')'){
                if(top && *q[top] == '('){
                    *q[top--] -= '0';
                    s[i] -= '0';
                }
            }else if(top && *q[top] == '['){
                    *q[top--] -= '0';
                    s[i] -= '0';
                }
            }
    }
    for(int i = 0; i < len; ++i){
        if(s[i] == '(' || s[i] == ')') printf("()");
        else if(s[i] == '[' || s[i] == ']') printf("[]");
        else printf("%c", s[i] + '0');
    }
    return 0;
}
posted @ 2026-07-23 17:12  爬爬w  阅读(1)  评论(0)    收藏  举报