题意:给你一串字符只有0,1,2三种字符,如果1,2,或者0,1相邻,可以交换位置,只有0,2不能交换位置。输出经过这种方法,字典序最少的字符串。
题解:贪心 因为只有0和2位置不能交换,所以对于1来说没有影响,先把所有1的个数记录下来。然后从前往后遍历,遇见0就输出0,遇见1就跳过,遇见2把全部1输出,再输出2,然后后面的遇见0就输出0,遇见2输出2,遇见1跳过。
c++:
#include<bits/stdc++.h>
using namespace std;
int num,flag;
int main()
{
string s,a;
cin>>s;
for(int i=0; i<s.size(); i++)
if(s[i]=='1') num++;
///特殊处理01,或者12的情况,直接sort
if(s.find("2")==s.npos||s.find("0")==s.npos)
{ sort(s.begin(),s.end());
cout<<s;
return 0;
}
for(int i=0; i<s.size(); i++)
{
if(s[i]=='0')cout<<'0';
else if(s[i]=='2'&&!flag)
{
for(int j=0; j<num; j++)
cout<<'1',flag=1;
cout<<'2';
}
else
{
if(s[i]=='1')
continue;
if(s[i]=='2')
cout<<'2';
}
}
return 0;
}
python:
s=input()
ans=''.join(c for c in s if c!='1')
i=(ans+'2').find('2')
print(ans[:i]+s.count('1')*'1'+ans[i:])