1、这道题做的时候灵光一闪:从后往前扫描,需要找到第一次出现降序的地方(因为至少交换它们,所得排列一定比原来字典序大),然后求下一个排列,没有降序的话,说明不存在下一个排列。
#include<cstdio>
#include<cstring>#include<algorithm>
using namespace std;
int main()
{
char s[60];
while(scanf("%s",s)==1){
if(s[0]=='#') break;
int len=strlen(s),j=len-1;
while(j&&s[j]<=s[j-1]) j--;
if(j==0) printf("No Successor\n");
else {next_permutation(s+j-1,s+len);printf("%s\n",s);}
}
return 0;
}