【每日算法】AB5 点击消除

89 阅读1分钟

问题

描述

牛牛拿到了一个字符串。 他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。 但相同而不相邻、不相同的相邻字母都是不可以被消除的。 牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?

输入描述:

一个字符串,仅由小写字母组成。(字符串长度不大于300000)

输出描述:

一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。

示例1

输入:abbc 输出:ac

示例2

输入:abba 输出:0

示例3

输入:bbbbb 输出:b

代码

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

struct stack {
    int size;
    int top;
    char data[300001];
} stack;

void init(struct stack* sk) {
    sk->top = 0;
    sk->size = 0;
}

void push(struct stack* sk, char a) {
    sk->data[sk->top] = a;
    sk->size ++;
    sk->top ++;
}

char top(struct stack* sk) {
    return sk->data[sk->top - 1];
}

char pop(struct stack* sk) {
    sk->size --;
    sk->top --;
    return sk->data[sk->top];
}

int main() {
    char str[300001];
    scanf("%s\n", str);
    int len = strlen(str);
    struct stack sk;
    init(&sk);
    for (int i = 0; i < len; i++) {
        if (sk.size == 0) {
            // printf("push %c\n", str[i]);
            push(&sk, str[i]);
        } else if (str[i] == top(&sk)) {
            // printf("push %c\n", str[i]);
            pop(&sk);
        } else{
            push(&sk, str[i]);
        }
    }
    if (sk.size == 0) {
        printf("0\n");
    } else {
        for (int i = 0; i < sk.top; i ++) {
            printf("%c", sk.data[i]);
        }
    }
    return 0;
}

思路

还是遍历,再判断字符是否等于栈顶,如果不等于或者栈为空就进栈,否则出栈