-
强调这题没有对数量作要求,比如abbcde,我们取下一个字母,即bccdea满足题意。
-
我们考虑用usechar存储字符集,把字符集存到vector数组方便管理。 随后我们考虑用lower_bound找到字符串中每一个字符s[i]在distinct_chars的位置,仅需让迭代器+1,就得到了下一个字母,并输出。
-
如果是最后一个字母(判断方式为it == distinct_chars.end() - 1),只需让迭代器取最开头的一个就行。
-
sort是必要的,否则lower_bound无法使用(lower_bound适用于有序)。
-
排序的时间复杂度近乎不计,总体而言时间复杂度O(n)
#include <bits/stdc++.h>
using namespace std;
unordered_set<char> usechar;
int main()
{
string s; cin >> s;
for (auto ele:s){
usechar.insert(ele);
}
if (usechar.size() == 1)
{
cout << -1 << endl;
return 0;
}
vector<char> distinct_chars(usechar.begin(), usechar.end());
int n = distinct_chars.size();
sort(distinct_chars.begin(),distinct_chars.end()); //方便使用lower_bound
for (int i = 0; i < s.size(); ++i)
{
char c = s[i];
auto it = lower_bound(distinct_chars.begin(),distinct_chars.end(),c);
if (it == distinct_chars.end() - 1) it = distinct_chars.begin();
else it = it + 1;
cout << *it ;
}
return 0;
}