题目描述
土豪大学的高富帅实验室里有一个回文帝,名叫小明。小明每次看到一个字符串的时候总喜欢看看它是不是回文串,如果这个字符串不是回文串的话,他就会将这个字符串里的字符重新排列,看看能不能构成回文串。
现在小明想让你写一个程序来帮助他实现上述过程。
输入格式
输入包含多组测试数据。每组输入包含一个字符串,长度不超过5,不包含空格等空白符。
提示:本题数据量不大,不必想复杂了。
输出
对于每组输入,如果输入的字符串本身就是回文串,或者将这个字符串里的字符重新排列后可以构成回文串,则输出Yes,否则输出No。
样例输入
qq
abc
aab
样例输出
Yes
No
Yes
本题很水的,但是A的确比较慢,快速代码能力还有待加强。总思路就是:在非回文的情况下,统计奇数个的字母如果出现次数大于1就No,0次或者1次就可以构造出回文。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
using namespace std;
const int maxx = 6;
char str[maxx];
map<char,int> mp;
int main(){
int len,i,n;
while(scanf("%s",str)!=EOF){
mp.clear();
len = strlen(str);
bool flg = true;
int limit = len/2;
for(i=0;i<len;++i){
++mp[str[i]];
if(str[i]!=str[len-i-1]){
flg = false;
}
}
n = 0;
if(flg){
printf("Yes\n");
}else{
map<char,int>::iterator ite = mp.begin();
for(;ite!=mp.end();++ite){
if(ite->second%2!=0){
++n;
}
}
if(n>1)printf("No\n");
else printf("Yes\n");
}
}
}