UVA - 10098 - Generating Fast(全排列)
Generating permutation has always been an important problem in computer science. In this problem you will have to generate the permutation of a given string in ascending order. Remember that your algorithm must be efficient.
Input
The first line of the input contains an integer n, which indicates how many strings to follow. The next n lines contain n strings. Strings will only contain alpha numerals and never contain any space. The maximum length of the string is 10.
Output
For each input string print all the permutations possible in ascending order. Not that the strings should be treated, as case sensitive strings and no permutation should be repeated. A blank line should follow each output set.
Sample Input
3
ab
abc
bca
Sample Output
ab
baabc
acb
bac
bca
cab
cbaabc
acb
bac
bca
cab
cba
题意:给出一串字符串,要求按字典序从小到大输出字符串的全排列
偷下懒,用 next_permutation 可以很好解决,具体操作过程是先将字符串中的所有字符按字典序排序,调用那个函数就好,下面总结一下 next_permutation的用法
next_permutation函数总结
int类型
int main()
{
int a[3];
a[0]=1; a[1]=2; a[2]=3;
do{
printf("%d%d%d\n", a[0], a[i], a[2]);
}while (next_permutation(a,a+3));
//如果存在a之后的排列,就返回true。如果a是最后一个排列没有后继,返回false,每执行一次,a就变成它的后继
}
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
如果改成 while(next_permutation(a,a+2));
输出:
1 2 3
2 1 3
只对前两个元素进行字典排序
显然,如果改成 while(next_permutation(a,a+1)); 则只输出:1 2 3
若排列本来就是最大的了没有后继,则next_permutation执行后,会对排列进行字典升序排序,相当于循环
int list[3]={3,2,1};
next_permutation(list,list+3);
printf("%d %d %d\n", list[0], list[1], list[2]);
//输出: 1 2 3
char类型
int main()
{
char str[205];
scanf("%s", str);
int len = strlen(str);
sort(str, str+len);
//该语句对输入的数组进行字典升序排序。如输入9874563102 puts(str); 将输出0123456789,这样就能输出全排列了
do {
puts(str);
}while(next_permutation(str, str+len));
return 0;
}
若采用 while(next_permutation(str, str+5)); 如果只输入1562,就会产生错误,因为str中第五个元素指向未知
若要整个字符串进行排序,参数5指的是数组的长度,不含结束符
string类型
int main()
{
string line;
while(cin>>line && line!="#")
{
if(next_permutation(line.begin(), line.end())) //从当前输入位置开始
cout<<line<<endl;
else cout<<"Nosuccesor\n";
}
}
int main()
{
string line;
while(cin>>line && line!="#")
{
sort(line.begin(), line.end());//全排列
cout<<line<<endl;
while(next_permutation(line.begin(), line.end()))
cout<<line<<endl;
}
}
以下是这道题的AC代码,用while 和 do-while 都OK,就是注意用while的时候记得把第一个输出来
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
char str[15];
int n;
scanf("%d", &n);
getchar();
while(n--){
gets(str);
int len = strlen(str);
sort(str, str+len);
puts(str);
while(next_permutation(str, str+len)){
puts(str);
}
printf("\n");
}
return 0;
}