题目链接: 点击打开链接
给出一个字符串, 可以更改任意位置字符或重新排序字符串使得字符串为回文, 要求变换最少次数, 输出变换后的字符串.
计数字符的个数, 遍历每个字符, 若当前字符为奇数, 则从后向前寻找个数为奇数的字符, 若找到的字符为本身, 则将当前字符放到字符串
中间, 否则替换为当前字符.
AC 代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 30;
string s;
int num[MAXN];
int main(int argc, char const *argv[])
{
cin >> s;
int len = s.size(), x = 25, pos = 0;
for(int i = 0; i < len; ++i)
num[s[i] - 'a']++;
for(int i = 0; i < 26; ++i) {
if(num[i] & 1) {
while(num[x] % 2 == 0 && i < x)
x--;
if(i == x) {
num[i]--;
s[len / 2] = i + 'a';
}
else {
num[x]--;
num[i]++;
}
}
for(int j = 0; j < num[i] / 2; ++j) {
s[pos] = i + 'a';
s[len - pos - 1] = i + 'a';
pos++;
}
}
cout << s << endl;
return 0;
}