UVA 146 – ID Codes

这道题要求生成给出字符串的下一个字典序字符串,首先我们先判断是否存在这样的一个字符串,

如果一个字符串的前一个字符总是比后一个字符大的话,那么是不存在下一个字典序的。我们从

后面开始查找,直到找到一个前面的字符比后面的小,然后在找到的这个字符到字符串结尾的区

间做变换从后往前,首字符和比它大的字符做交换,交换的最后结果是找到了比首字符大一点的

字符,然后将该区间内除首字符的其他字符按字典序排序。即找到这个区间内下一个首字符的最

小字典序。

不用库函数的写法:

#include<cstdio>
#include<cstring>
#include<cstdlib>

char s[60];

int cmp( const void *_p, const void *_q)
{
char *p, *q;
p = (char *)_p;
q = (char *)_q;
return *p - *q;
}

int main()
{
int k;
while( true)
{
scanf( "%s", s);
if( s[0] == '#') break;
int len = strlen( s);
for( k = len - 1; k > 0; k --)
if( s[ k] > s[ k - 1])
break;
if( k == 0)
{
printf( "No Successor\n");
continue;
}
for( int i = len - 1; i >= k; i --)
if( s[i] > s[k - 1])
{
char temp = s[i];
s[i] = s[k - 1];
s[k - 1] = temp;
break;
}
qsort( s + k, len - k, sizeof( char), cmp);
printf( "%s\n", s);
}
return 0;
}

 

 

然后用了C++的next_permutation函数写了下:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

char s[60];
int main()
{
int k;
while( true)
{
scanf( "%s", s);
if( s[0] == '#') break;
int len = strlen( s);
for( k = len - 1; k > 0; k --)
if( s[ k] > s[ k - 1])
break;
if( k == 0)
{
printf( "No Successor\n");
continue;
}
next_permutation( s, s + len);
printf( "%s\n", s);
}
return 0;
}

原文链接: https://www.cnblogs.com/Yu2012/archive/2012/01/14/2322588.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    UVA 146 – ID Codes

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/40201

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午4:54
下一篇 2023年2月8日 下午4:54

相关推荐