题目链接
题意:给你一个字符串,你可以任意的改变字母。和调整顺序,但是,调整顺序不计操作次数。要求操作次数最小,的时候字典序最小的回文串。
解法:考虑到是回文串,字符串里面最多只有一种奇数字母,我们统计好字母的个数,把后面的奇数的字母减少一个变为前面的是奇数的字母,这样既保证了操作次数小,也保证了字典序。
#define CF
#ifndef CF
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#else
#include<bits/stdc++.h>
#endif // CF
using namespace std;
#define LL long long
#define pb push_back
#define X first
#define Y second
#define cl(a,b) memset(a,b,sizeof(a))
typedef pair<long long ,long long > P;
const int maxn=2*100005;
const LL inf=1LL<<50;
const LL mod=1e9+7;
string s;
int num[26];
int main(){
cin>>s;
int n=s.length();
for(int i=0;i<n;i++){
num[s[i]-'a']++;
}
int i=0,j=25;
while(i<=j){
while(num[i]==0||num[i]%2==0)i++;
while(num[j]==0||num[j]%2==0)j--;
num[i]++;
num[j]--;
i++;j--;
}
// for(int i=0;i<26;i++){
// printf("%d ",num[i]);
// }
string tmp="";
for(int i=0;i<26;i++)if(num[i]&&num[i]>1){
int x=num[i]/2;
while(x--)tmp+=char('a'+i);
}
cout<<tmp;
for(int i=0;i<26;i++)if(num[i]&&num[i]&1){
cout<<char('a'+i);
}
reverse(tmp.begin(),tmp.end());
cout<<tmp<<endl;
return 0;
}