您的位置:首页 > 其它

ZCMU—1724

2016-12-08 11:00 211 查看

1724: 字符串

Time Limit: 1 Sec  Memory Limit: 128 MB

[Submit][Status][Web
Board]

Description

给你一个小写字母组成的字符串,你可以任意的改变字母变成其他字母,也可以调整字符串的顺序,但是,调整顺序不计操作次数。要求输出操作次数最小的时候字典序最小的回文串。

Input

多组测试数据

输入一个字符串s (1<=|s|<=1000)

Output

输出改变后的字符串

Sample Input

aabc

aabcd

Sample Output

abba

abcba

【分析】

这道题...乍一看好像可能是个dp..但是仔细读题之后发现其实...并没有那么复杂
因为题目里说了调整字符串顺序不算操作次数,有了这句话,这道题就不需要再考虑字符的移动情况,所以这道题就简化成了给你一串字符,将其中一些字符改变之后使得字符中出现次数为奇数的字符只有一个或者没有。因为要满足回文串这个条件
比如aabc   a出现两次,b一次,c一次,只要把b和c中的一个换掉就可以了。
那怎么换呢?因为要满足字典序最小,那么显然,把大的字符换成小的字符就可以了,换的过程中,显然不能把出现次数为奇数的字符换成出现次数为偶数的字符,显然这样会导致原来是偶数次的字符变成奇数次,这样就不能满足首要条件操作次数最小了
所以,只要从大的字符开始换,每次将奇数次的大字符换成奇数次的小字符就可以了..

【代码】
#include<stdio.h>
#include<string.h>
int main()
{
char s[10000];
int f[500];
while(~scanf("%s",s))
{
memset(f,0,sizeof(f));
for(int i=0;s[i]!='\0';i++) f[s[i]]++;
for(int i='z';i>='a';i--)
if(f[i]%2)
for(int j='a';j<i;j++)
if(f[j]%2!=0)
{
f[j]++;
f[i]--;
break;
}
for(int i='a';i<='z';i++)
for(int j=0;j<f[i]/2;j++)
printf("%c",i);
for(int i='a';i<='z';i++)
if(f[i]%2!=0)
printf("%c",i);
for(int i='z';i>='a';i--)
for(int j=0;j<f[i]/2;j++)
printf("%c",i);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: