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]!='\0';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(); } }