#include <iostream> #include <vector> #include <map> using namespace std; int main() { string str; char ch1 = 0, ch2 = 0; while (cin >> str) { // 注意 while 处理多个 case map<char, int> mp; for (char it : str) { mp[it] = 1; } if (mp.size() <= 1) { cout << "-1" << endl; return 0; } vector<char> vec; for (int i = 0; i < 26; ++i) { if (mp['a' + i] == 1) { vec.push_back('a' + i); } } int i = 0; int j = vec.size() - 1; for (char it : str) { // 全部输出之之后乱输出即可; // 放在开始,保证i、j不超出范围 if (i > j) { if (vec[0] != it) { cout << vec[0]; } else { cout << vec[1]; } continue; } // 前后两个指针,必定有一个是不同字符 // 如果一个指针,需要单独处理跳过的情况 if (vec[i] != it) { cout << vec[i]; ++i; } else if (vec[j] != it) { cout << vec[j]; --j; } else { cout << vec[0]; } } } } // 64 位输出请用 printf("%lld")
考点一:map,或这26数组,hash。
考点二:输出,如何高效准确的把所有的字母都使用上,我的方法是从前和从后两个指针,交替输出。
这样可以做到,一边相同时可以使用另外一边。
而且不同记录那个是相同的,但是存在的一个问题是,如果从前和从后相遇,且恰好那个元素相同需要单独考虑。