小b有一个字符串S,现在她希望重排列S,使得S中相邻字符不同。
请你判断小b是否可能成功。
样例解释:将"aab"重排为"aba"即可。
输入
输入一个只包含小写字母的字符串S,其长度n满足1<=n<=500
输出
如果可能,输出"Possible"; 否则,输出"Impossible"。
输入样例
aab
输出样例
Possible
通过推理发现。当字符串 SS 中某一种字符出现次数大于字符串长度的一半时(奇数上取整),相邻字母相同的情况是一定会出现的。
反之,如果字符串 SS 中每种字符的出现次数都小于等于字符串长度的一半(奇数上取整),我们可以用形如 ababac..azaababac..aza 的循环摆放的方法获得符合要求的字符串。
根据贪心的思想,这样可以放下尽可能多的 aa 。
因此,本题的解法就是统计字符串 SS 中每种字符出现的次数,再用最多的次数与字符串长度的一半作比较即可。
参考程序
#include <bits/stdc++.h>
using namespace std;
const int ASCII = 255;
int a[ASCII];
int main() {
string str;
cin >> str;
for (int i = 0; i < str.length(); i++) {
a[str[i]]++;
}
int m = *max_element(a, a + ASCII);
if (str.length() % 2 == 0) {
if (m <= str.length() / 2)
cout << "Possible";
else
cout << "Impossible";
} else {
if (m <= str.length() / 2 + 1)
cout << "Possible";
else
cout << "Impossible";
}
}