这是一道关于排列的题目
主要是求字典序下的下一个排列
我的思路是:对给定的一个排列从后往前搜索,直到找到一个字母(记为n)比它的前一个字母(记为m)大。
然后从n之后找一个第一个比m大的字母,并将其与m交换。然后对m以后的序列从小到大排序生成最小字典序排列,
这样就得到答案了。
当然,如果找不到字母n就输出“No Successor”啦。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
bool cmp(char a,char b) //重新定义了快排,使其可以用于字母排序
{
int i;
i=a-b;
if(i<0)
return true;
return false;
}
int main()
{
char a[50+5],min;
int i,flag,len,t,j;
while(cin>>a)
{
flag=0;
if(a[0]=='#')
break;
len=strlen(a);
for(i=len-1;i>=1;i--)
{
int m=0;
if(a[i]-'a'>a[i-1]-'a')
{
flag=1;
sort(a+i,a+len);
for(j=i;j<len;j++)
{
if(a[j]-'a'>a[i-1]-'a')
{
t=a[j];
a[j]=a[i-1];
a[i-1]=t;
m=1;
break;
}
}
}
if(m)
break;
}
if(!flag)
cout<<"No Successor"<<endl;
else
cout<<a<<endl;
}
return 0;
}