生成字典序全排列
1Y
引用STL
#include<stdio.h>
#include<string.h>
#include<algorithm>
int main(){
char s[110];
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s);
int len=strlen(s);
std::sort(s,s+len);
do{
printf("%s\n",s);
}while(std::next_permutation(s,s+len));
printf("\n");
}
return 0;
}
看原理自己编写
给你一个序列28467186310
下一个排列是啥呢?
28467 是是前缀,不变的
看后面186310
找到3是1以后比1大的最小元素
变为
386110
然后反序
301168
接上就是了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#define INF (int)1e9
char s[110];
bool Next_per(){
int len=strlen(s);
int aim=INF;
int i;
for(i=len-1;i>0;i--){
if(s[i]>s[i-1]){
aim=i-1;
break;
}
}
if(aim==INF)return 0;
for(i=len-1;i>aim;i--){
if(s[i]>s[aim])break;
}
char t;
t=s[i];s[i]=s[aim];s[aim]=t;
int l=aim+1,r=len-1;
while(l<r){
t=s[l];
s[l]=s[r];
s[r]=t;
l++;
r--;
}
return 1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s);
int len=strlen(s);
std::sort(s,s+len);
do{
printf("%s\n",s);
}while(Next_per());
printf("\n");
}
return 0;
}
本文介绍了一种生成字符串所有可能的字典序全排列的方法,包括使用STL中的next_permutation函数简化实现过程,以及从原理出发手写实现算法的过程。通过具体的例子解释了如何寻找下一个排列并进行字符串反转来生成所有可能的排列。
3753

被折叠的 条评论
为什么被折叠?



