1 solutions

  • 0
    @ 2025-6-12 22:16:28

    贪心,如果当前栈顶字符小于未入栈的字符中最小字符,则出栈,否则入栈,可以预处理未入栈最小字符。

    #include <bits/stdc++.h>
    using namespace std;
    char a[100005];//入栈序列
    char b[100005];//b[i]表示从第n-1个字符到第i个字符中最小的那个
    char ans[100005];//答案(出栈队列)
    char zhan[100005];//栈
    int n;
    int main() {
        cin >> n;
        scanf("%s", &a);
        char mc = 'z';
        //预处理b数组
        for (int i = n - 1; i >= 0; i--) {
            if (a[i] <= mc) {
                mc = a[i];
            }
            b[i] = mc;
        }
        int ansp = 0; //答案指针
        int zhanp = 0; //栈指针
        for (int i = 0; i < n; i++) {//枚举每一个字符
            //栈非空且栈顶小于未入栈的最小字符
            while(zhanp != 0 && zhan[zhanp] <= b[i]) {
                ans[ansp] = zhan[zhanp];//出栈
                zhanp--;
                ansp++;
            }
            if (a[i] == b[i]) {//如果当前字符等于未入栈字符最小值
                ans[ansp] = a[i];//入栈再出栈
                ansp++;
            } else {//否则
                zhanp++;//入栈
                zhan[zhanp] = a[i];
            }
        }
        while (zhanp != 0) {//栈非空,出栈
            ans[ansp] = zhan[zhanp];
            zhanp--;
            ansp++;
        }
        printf("%s", ans);
        return 0;
    }
    
    • 1

    Information

    ID
    677
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    48
    Accepted
    4
    Uploaded By