题目大意:给出一串字符,将这些字母升序全排列后,求该串字符的下一串,若是最后一串,输出 No Successor
解题思路:从后往前扫,碰到第一个 s[i] > s[i-1] 的时候,用 i(包括)后的大于 s[i-1] 当中最小的和 s[i-1] 换位置,然后对 i(包括)后的字母排升序。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
bool cmp(char a, char b) {
return a < b;
}
int main() {
char s[100];
while (scanf("%s", s) != EOF && s[0] != '#') {
int len = strlen(s);
int tag = 0;
for (int i = len-1; i > 0; i--)
if (s[i] > s[i-1]) {
tag = 1;
sort(&s[i], s+len, cmp);
int t = i;
while (s[i-1] >= s[t]) t++;
char c = s[i-1];
s[i-1] = s[t];
s[t] = c;
sort(&s[i], s+len, cmp);
break;
}
if (tag) printf("%s\n", s);
else printf("No Successor\n");
}
return 0;
}
STL:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char s[100];
int main() {
while (cin >> s && s[0] != '#') {
if (next_permutation(s, s+strlen(s)))
cout<<s<<endl;
else cout<<"No Successor"<<endl;
}
return 0;
}
STL 简直黑科技…