C. Minimal string(贪心法,栈)

这题贪心还是比较好写的…

t , 由于t串只能从末尾取字母,所以可以当成一个栈来处理

f l a g , s 预处理flag数组,表示s串每个位置往后的最小字母

s 1 s 那么从s串的1顺序枚举到s串的末尾

. , , \color{Red}Ⅰ.如果这个字母是往后最小的,那么把栈中所有小于等于的输出,再输出这个字母

. x , x , \color{Red}Ⅱ.如果这个字母后有更小的字母x,把栈中所有小于等于x的输出,再把这个字母入栈

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int top=0;
char s[maxn],minn,flag[maxn],q[maxn];
string u;
int main()
{
	cin >> (s+1);
	int len=strlen(s+1);
	minn=s[len];flag[len]='!';
	for(int i=len-1;i>=1;i--)
	{
		if(minn<s[i])	flag[i]=minn;
		else	flag[i]='!';
		minn=min(minn,s[i]);	
	}
	for(int i=1;i<=len;i++)
	{
		if(flag[i]=='!')//现在这个字母就是最小的
		{
			while(top>=1&&q[top]<=s[i])	cout<<q[top--];
			cout<<s[i];	
		}
		else//后面有更小的字母 
		{
			while(top>=1&&q[top]<=flag[i])	cout<<q[top--];	
			q[++top]=s[i];
		} 
	}
	while(top)	cout<<q[top--];
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107221760