题意:
给定字符串str,给定两种操作,求这两种操作下能够得到的字典序最小的字符串。
题解:
贪心。
从小到大挑选,只要s中有,就把多余的给t,把要挑选的给u。当然再次之前要检查t的末尾是否小于要挑选的字符,如果是则压入u。本题其实是队列和栈的基本应用问题。
#include<iostream>
#include<stack>
#include<queue>
#include<string>
#include<cstring>
using namespace std;stack<char> sta1;
stack<char> sta2;
queue<char> que;
string str;
int arr[105];
int brr[105];int main(){memset(arr,0,sizeof(arr));memset(brr,0,sizeof(brr));cin>>str;int len=str.length();for(int i=len-1;i>=0;i--){sta1.push(str[i]);int x=str[i]-'a';arr[x]++;}for(int i=0;i<26;i++){char tmp=(char)(i+'a');while(!sta2.empty()&&sta2.top()<=tmp){char ch=sta2.top();int x=ch-'a';que.push(ch);sta2.pop();brr[x]--;}while(arr[i]){char ch='a'+i;if(sta1.top()==ch){que.push(ch);arr[i]--;sta1.pop();}else{char pity=sta1.top();int x=pity-'a';brr[x]++;arr[x]--;sta2.push(pity);sta1.pop();}}}while(!sta2.empty()){que.push(sta2.top());sta2.pop();}while(!que.empty()){cout<<que.front();que.pop();}cout<<endl;
}