题目大意:输入一个字符串,输出它的下一个字典序排列。
字典序算法思想:
1.从右向左寻找字符串找出第一个a[i]<a[i+1]的位置i;
2.从右向左找出第一个大于a[j]的元素a[i];
3.swap(a[i],a[j])
4.将a[i]......到a[stelen(a)]倒序
5.输出a
代码如下:
#include<iostream> #include<cstdio> #include <cstring> #include<algorithm> #include<cstdlib> using namespace std; inline void swap(int &a,int &b){ int temp; temp=a; a=b; b=temp; } void Print(int a[],int n){ for(int i=1;i<=n;i++){ printf("%c",a[i]+'0'); if(i==n) cout<<"\n"; } return ; } int main(){ int Dire[100],q; char a[100]; int r,l,n,t; int count=0,c=1; while(scanf("%s",a)&&strcmp(a,"#")!=0){ n=strlen(a);//求出字符串的长度 for(int i=1;i<=n;i++){//初始化待排列的数字串 Dire[i]=a[i-1]-'0'; } int i=n-1; l=0; while(i>0){ if(Dire[i]<Dire[i+1]){//找到Dire[i]<Dire[i+1] l=i; break; } else{ i--; } } if(l){ //存在后续排列 for(int j=n;j>l;j--){ if(Dire[j]>Dire[l]){ //从右向左找到第一个Dire[j]>Dire[i] r=j; break; //找到第一个Dire[j]时,即跳出循环 } } swap(Dire[l],Dire[r]); //交换Dire[j]>Dire[i] for(int p=l+1,q=n;p<q;p++,q--)//倒序 swap(Dire[p],Dire[q]); Print(Dire,n); } else{ cout<<"No Successor"<<endl; } } return 0; }
原文地址:http://blog.csdn.net/wzg272365960/article/details/39699545