题目链接:UVa 146 - ID Codes
一看这三位数的题号就知道应该是道基础、经典的题目。
求下一个排列。
说一下算法。
1、从字串最后往前遍历,找到一个字符,要求是这个字符应该小于(字符的话应该是编码的小于)其后边紧跟着的那个字符,把这个字符的下标记录为i。
2、再次从字串最后开始遍历,到i+1位置停止,找到一个比i处字符大的字符,停止,记录其下标为j。
3、交换i和j处对应的字符。
4、对从i+1处到最后按照字典序排序。
如果要自己写算法,按照上边的写就可以了。不过STL中有直接求下一个排列的函数next_permutation。对这个函数的具体讲解:stl算法:next_permutation剖析
/**
0.012s
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 50 + 10;
int len;
char a[MAX_N];
int cmp(const void *a,const void *b)
{
return *(char*)a-*(char*)b;
}
int main()
{
while(cin>>a && a[(len = strlen(a)) - 1] != '#')
{
int i,j;
for(i= len - 1;i > 0;i--)
{
if(a[i] > a[i-1])
break;
}
if(i == 0)
{
cout<<"No Successor"<<endl;
continue;
}
for(j = len - 1;j >= i;j--)
{
if(a[j] > a[i-1])
break;
}
char temp = a[i-1];
a[i-1] = a[j];
a[j] = temp;
qsort(&a[i],len-i,sizeof(temp),cmp);
cout<<a<<endl;
}
return 0;
}
/**
0.009s
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 50 + 10;
int len;
char a[MAX_N];
int main()
{
int len;
while(cin>>a,strcmp(a,"#"))
{
len = strlen(a);
int i;
for(i= len - 1;i > 0;i--)
{
if(a[i] > a[i-1])
break;
}
if(i == 0)
{
cout<<"No Successor"<<endl;
continue;
}
next_permutation(a,a+len);
cout<<a<<endl;
}
return 0;
}
/**
0.012s
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 50 + 10;
int len;
char a[MAX_N];
int main()
{
int len;
while(cin>>a && a[(len = strlen(a)) - 1] != '#')
{
int i;
for(i= len - 1;i > 0;i--)
{
if(a[i] > a[i-1])
break;
}
if(i == 0)
{
cout<<"No Successor"<<endl;
continue;
}
next_permutation(a,a+len);
cout<<a<<endl;
}
return 0;
}
/**
0.009s
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 50 + 10;
int len;
char a[MAX_N];
int main()
{
int len;
while(cin>>a,strcmp(a,"#"))
{
len = strlen(a);
if(!next_permutation(a,a+len))
cout<<"No Successor"<<endl;
else
cout<<a<<endl;
}
return 0;
}