大家好,又见面了,我是你们的朋友全栈君。
题目链接:http://poj.org/problem?id=1146
题目大意:求一个字符串的后继字符串,即对一个字符串进行字典序排列的后一个!
方法:对字符串进行从后向前进行遍历,如果直到找到后面的最大的非递增序列,然后在这个序列中找到比其前面大的最小的一个字母和其交换,再对交换后的后面的部分进行字典序排列再次进行输出即可以拉!
#include<iostream>
#include<string>
using namespace std;
int cmp(const void *a,const void *b)
{
return *(char *)a-*(char *)b;
}
int main()
{
char s[60];
int i,j,sign,len;
while(1)
{
gets(s);
sign=0;
len=strlen(s);
if(len==1 && s[0]=='#')
break;
for(i=len-1; i>=1; i--)
if(s[i-1]<s[i])
{
sign=1;
break;
}
if(sign==0)
printf("No Successor\n");
else
{
char ma=120;
int k;
for(j=i; j<len; j++)
if(s[j]<ma && s[j]>s[i-1])
{
ma=s[j];
k=j;
}
char m=s[i-1];
s[i-1]=s[k];
s[k]=m;
qsort(&s[i],len-i,sizeof(char),cmp);
for(j=0; j<len; j++)
printf("%c",s[j]);
printf("\n");
}
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139939.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...