ZCMU—1724

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");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值