UVa 146 ID Codes

题目:[url]http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=107&page=show_problem&problem=82[/url]
题目的要求是找出字典序中的下一个排列。
从后往前查找,如果一直都是非递减的,那么就是“No Successor”。一旦发现不符合条件的字符(if(str[i]<str[i+1]),那么就把该字符与它后面的所有字符中恰好比它大的字符调换,比方说sample中的abaacb,我们找到第一个不符合非递减条件的字母:中间的那个a,然后将它与b调换,因为在那个a后面是cb,恰好比a大的是b。第三步就是把该字符后面的所有字符按字典序排序,在sample中就是把ca排序成为ac,结束。
讲得不是很清楚,其实就是一个进位的思想,找到了那个不符合条件的字符,而它后面的都是字典序逆序,它后面的字典序中的下一个排列就是要“进位”了,所以就把那个找到的字符与它后面的所有字符中恰好比它大的字符调换,就完成了“进位”,然后还要把找到的字符后面的所有字符按字典序排序。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(void const *a,void const *b)
{
return *((char *)a)-*((char *)b);
}
int main()
{
char str[100];
for(;;)
{
int i,len,flag=0;
scanf("%s",str);
if(str[0]=='#') break;
len=strlen(str);
if(len==1)
{
printf("No Successor\n");
continue;
}
for(i=len-2;i>=0;i--)
{
if(str[i]<str[i+1])
{
char t;
int j=len-1;
while(str[j]<=str[i]) j--;
t=str[i];
str[i]=str[j];
str[j]=t;
flag=1;
qsort(str+i+1,len-i-1,1,cmp);
break;
}
}
if(flag)
puts(str);
else
printf("No Successor\n");
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值