说到排列,肯定先想到生成排列,这一节讲如何按照字典序法生成数字的全排列或者某一排列的下一排列。


原理如上,给个题目如何?
题目传送门
题意很简单,代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
if(s[0]=='#')
break;
int key=-1;
int len=s.length();
for(int i=len-1;i>0;i--)
{
if(s[i]>s[i-1]) //这里找到最后一组升序对
{
key=i-1;
break;
}
}
if(key==-1)
{
cout<<"No Successor"<<endl; //如果没找到的话说明已经是最后一个排列了
continue;
}
else
{
for(int i=len-1;i>key;i--)
{
if(s[i]>s[key]) //按照原理找到最后一个大于s[i]的数
{
//cout<<i<<" "<<key<<endl;
char c=s[i];
s[i]=s[key];
s[key]=c;
break;
}
}
char ch[1000];
for(int i=key+1;i<len;i++)
ch[i]=s[i];
for(int i=key+1;i<len;i++)
s[i]=ch[len-i+key];
cout<<s<<endl;
}
}
return 0;
}