797C C. Minimal string

贪心,后缀

思路:

逆序维护一个数组minn【i】=x,表示第i个位子后边最小的字符是x.

那么对应维护一个栈,如果此时栈顶字符小于等于minn【此时要加入的元素的位子】,那么就出栈,将栈顶这个字符输出;

同时每个字符都在操作结束后入栈。

来源https://blog.csdn.net/mengxiang000000/article/details/70210727

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<unordered_map>
#include<stack>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
using namespace std;
const int MAXN=1e5+10;
char in[MAXN];
char mn[MAXN];///从len-1到i为止最小的字符
map<char,int >mp;
int main()
{
//    freopen("in.txt","r",stdin);
    stack<char>stk;
    scanf("%s",in);
    int l=strlen(in);
    for(int i=l-1;i>=0;i--){
        if(i==l-1)mn[i]=in[i];
        else mn[i]=min(mn[i+1],in[i]);
    }
    for(int i=0;in[i]!='';i++){
///        stk.push(in[i]);
///如果放在这里,并且当前字符小于等于mn[i],就会导致
///先输出当前字符,而此时栈中可能有更小的字符
        while(!stk.empty()){
            if(stk.top()<=mn[i]){
                printf("%c",stk.top());
                stk.pop();
            }
            else break;
        }
        ///为什么要放在后面?
        stk.push(in[i]);
    }
    while(!stk.empty()){
        printf("%c",stk.top());
        stk.pop();
    }
}
原文地址:https://www.cnblogs.com/MalcolmMeng/p/9975408.html