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
aabcaabcd
Sample Output
abbaabcba
【分析】
这道题...乍一看好像可能是个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"); } }
相关文章推荐
- eclipse中maven的安装
- es 一 ---- elasticsearch1.5安装使用+IK中文分词
- 第一百二十二节,JavaScript表单处理
- 【第十五周项目2 - 用哈希法组织关键字】
- Android从assets目录下读取文件相关
- Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)
- python-ironicclient使用
- 调用手机话费充值API的SDK编写思路
- Codeforces 703E
- 十五周项目1—哈希表及其运算实现
- zmq 中的事件
- Android图片压缩(质量压缩和尺寸压缩)&Bitmap转成字符串上传
- 蓝牙设计
- javascript正则表达式例子
- 第十五周项目一(7)归并排序
- 火车进站问题的求解——华为OJ高级难度题目
- 推荐React组件库
- 第十五周项目一(验证算法)
- springMVC 前台传递json格式数据到后台
- Linux下的tar压缩解压缩命令详解