IT民工
加油!

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

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

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

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

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

小字典序。

不用库函数的写法:

#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;
}



posted on 2012-01-14 22:13  找回失去的  阅读(1152)  评论(0)    收藏  举报