上次做这道题目时没理解题目意思==1WA
实际上这道题目说的是
输出这些字母的这个排列的字典序下一个排列
然后1Y
实际上从后往前看是不是不减列
若全是,怎已经是last
否则
可以找到x
使得s[x]<s[x+1];
这个x就是代码中的l
接下来输出0~x-1;
然后统计x~len-1的字母数量
x是一定要升级的
升级x之后维护下,按照增序输出字母就好了
#include<stdio.h>
#include<string.h>
int main(){
char s[100];
while(scanf("%s",s)!=EOF){
int len=strlen(s);
if(len==1&&s[0]=='#')break;
int i;
for(i=len-1;i>=1;i--){
if(s[i]>s[i-1])break;
}
if(i==0){
printf("No Successor\n");
continue;
}
int l=i-1;
int j;
for(j=0;j<l;j++)printf("%c",s[j]);
int sum[30];
for(i=0;i<26;i++)sum[i]=0;
for(j=l;j<len;j++)sum[s[j]-'a']++;
for(i=s[l]-'a'+1;i<26;i++)if(sum[i])break;
printf("%c",i+'a');
sum[i]--;
for(i=0;i<26;i++){
for(j=1;j<=sum[i];j++)printf("%c",i+'a');
}
printf("\n");
}
return 0;
}
本文详细介绍了如何解决字典序下一个排列的问题,并通过代码实现。重点在于找到需要升级的元素及其后续操作。
1596

被折叠的 条评论
为什么被折叠?



