贪心,后缀
思路:
逆序维护一个数组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]!='