C++找字符串直接后继
存在三十六个字符{0, 1, 2, . . . , 9, a, b, c, . . . , z}.字符串由这三十六个字符组成,模仿数学中的进制,找到这个字符串的直接后继,例如a的后继是b,aaa的后继是aab。。。。。
我的算法是,从后往前,遍历字符串,如果是逆序的,就没有后继
否则,找到第一个非逆序的字符,和之前遍历的字符中比它大,而且最接近的那个和他交换,再将其余遍历字符由小到大排序
例如,kaka7ba642,后往前第一个非逆序的是7,7与6交换,7ba42再由小到大排序为247ab,所以直接后继是kaka247ab。
Sample Input
12
03snd3fk5ee2
gfedcba987
036420
Sample Output
12 -> 21
03snd3fk5ee2 -> 03snd3fke25e
gfedcba987 -> no successor/*没有后继的时候*/
036420 -> 040236
我写了个半成品的代码:
#include"stdio.h"
#include"string.h"
#include"math.h"
int main()
{char a[100];
int n,i,j,t,tt,m=0,min=10000,temp;
while(scanf("%s",a)!=EOF)
{
n=strlen(a);
if(n==1) { printf("%c -> no successor\n",a[0]);}
else{
printf("%s ->",a);
for(i=n-1;i>0;i--)
{if(a[i-1]<a[i])
{ t=i-1;m=1;break;}/*m=1,表示找到第一个非逆序的元素*/
}
if(m==0) printf("no successor\n");
if(m==1) { for(j=i;j<n;j++)
if((a[j]>a[i-1])&&(('a[j]'-'a[i-1]')<min))
{
'a[j]'-'a[i-1]'=min; tt=j; /*报错,找后面比改字符大又最接近的怎么找呢,这里我不会写,这里就当作伪代码看吧*/
}
}
temp=a[t];a[t]=a[tt];a[tt]=temp;
for(j=t+1;j<n;j++)
{for(i=t+1;i<n;i++)
{if(a[j]>a[i])
{temp=a[i];a[i]=a[j];a[j]=temp;}/*顺请教冒泡排序是这么写的么?有人告诉我qsort(),这个函数怎么用么?*/
}
}
printf("%s\n",a);
}
}
return 0;
}