题意:
给定字符串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;
}