#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> updown_string(string& s) {
vector<string> strings;
string up_string;
string down_string;
if (s == "abcdefghi") {
up_string = "null";
strings.push_back(up_string);
down_string = "abcdefgih";
strings.push_back(down_string);
return strings;
}
else if (s == "ihgfedcba") {
up_string = "ihgfedcab";
strings.push_back(up_string);
down_string = "null";
strings.push_back(down_string);
return strings;
}
else {
int m, n;
up_string = s;
down_string = s;
//上一个排列
//从后向前,找到单词中第一个前面数大于后面数的位置
for (m = 7; m >= 0; m--) {
if (up_string[m] > up_string[m + 1]) {
break;
}
}
//从后向前,找到单词中第一个小于前面数的位置
for (n = 8; n > m; n--) {
if (up_string[n] < up_string[m]) {
break;
}
}
swap(up_string[m], up_string[n]);
reverse(up_string.begin() + m + 1, up_string.end());
strings.push_back(up_string);
//下一个排列
//从后向前,找到单词中第一个前面数小于后面数的位置
int i = 7;
while (i >= 0 && down_string[i] >= down_string[i + 1]) {
i--;
}
//从后向前,找到单词中第一个大于前面数的位置
if (i >= 0) {
int j = 8;
while (j >= 0 && down_string[i] >= down_string[j]) {
j--;
}
swap(down_string[i], down_string[j]);
}
reverse(down_string.begin() + i + 1, down_string.end());
strings.push_back(down_string);
return strings;
}
}
int main() {
string s;
cin >> s;
vector<string> strings;
strings = updown_string(s);
for (int i = 0; i < 2; i++) {
cout << strings[i] << endl;
}
return 0;
}
算法——求字符串字典序的上一个排列和下一个排列
最新推荐文章于 2024-04-03 14:21:06 发布