题意:给出string s长度<=1e5, op1:把s的第一个字符移动到t末尾.op2:把t最后一个字符移到u末尾,求u能得到的最小字典序?
字典序最小,greedy:从左到右,每位尽量小.
保存每个字符的出现次数 当前位置可以填入的字符要么为当前栈顶 若有比栈顶还小的字符 则找到该字符即可 复杂度O(26*N)
#include <bits/stdc++.h>
using namespace std;
const int N=2e6+20;
string s,t,u,a;
//题意:给出string s长度<=1e5, op1:把s的第一个字符移动到t末尾.op2:把t最后一个字符移到u末尾,求u能得到的最小字典序?
//greedy:从左到右,每位尽量小
int b[30];//字符i出现次数
int pos[30];//字符i最后出现的位置
int h[N];
stack<char> sta;
int main()
{
while(cin>>s)
{
int len=s.length();
memset(b,0,sizeof(b));
for(int i=0;s[i];i++)
b[s[i]-'a']++;
int i=0,k;
while(s[i])
{
//当前位置尽量小
//当前可以取栈顶的字符 或者找到更小的字符
int k1=26;
if(!sta.empty())
k1=sta.top()-'a';
for(k=0;k<26;k++)//当前可以取字符k
{
if(b[k])
break;
}
k=min(k1,k);//
while(true)
{
if(!sta.empty()&&sta.top()-'a'==k)//找到字符k
break;
b[s[i]-'a']--;
sta.push(s[i++]);
if(s[i]=='\0')
break;
}
if(!sta.empty())
{
printf("%c",sta.top());
sta.pop();
}
}
while(!sta.empty())
{
char c=sta.top();
sta.pop();
printf("%c",c);
}
cout<<endl;
}
return 0;
}