题目链接:http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=21373
题目描述
土豪大学的高富帅实验室里有一个回文帝,名叫小明。小明每次看到一个字符串的时候总喜欢看看它是不是回文串,如果这个字符串不是回文串的话,他就会将这个字符串里的字符重新排列,看看能不能构成回文串。
现在小明想让你写一个程序来帮助他实现上述过程。
输入格式
输入包含多组测试数据。每组输入包含一个字符串,长度不超过5,不包含空格等空白符。
提示:本题数据量不大,不必想复杂了。
输出
对于每组输入,如果输入的字符串本身就是回文串,或者将这个字符串里的字符重新排列后可以构成回文串,则输出Yes,否则输出No。
样例输入
qq
abc
aab
样例输出
Yes
No
Yes
Hint:如果判断字符串不是回文后,分别求出字符串中不同字符出现的次数。如果出现次数为奇数次的个数大于1,则字符重新排列后也不可能是回文。
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
bool isodd(int n)
{
if (n % 2 != 0)
return true;
return false;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("D:\\in.txt", "r", stdin);
freopen("D:\\out.txt", "w", stdout);
#endif
string str;
while (cin >> str)
{
string s = str;
reverse(str.begin(),str.end());
if (s == str)
{
cout << "Yes" << endl;
}
else
{
vector<char> coll;
vector<int> cnt(5, 0);
coll.push_back(s[0]);
cnt[0] = 1;
for (int i = 1; i < s.size(); i++)
{
int j(0);
for (j = 0; j < coll.size(); j++)
{
if (s[i] == coll[j])
{
cnt[j]++;
break;
}
}
if (j == coll.size())
{
coll.push_back(s[i]);
cnt[coll.size() - 1]++;
}
}
int t = count_if(cnt.begin(), cnt.end(), isodd);
if (t <=1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}