无重复的全排列
分析
- abc的全排列,先取a放首位,将剩余的bc进行全排列,即3个字母的全排列,轮流将每一个字母a、b、c放在首位,剩下的2个字母也进行全排列……依此递归。
代码
#include<iostream>
#include<cstring>
using namespace std;
void swap(char* p,char* q){
char temp=*p;
*p=*q;
*q=temp;
}
void permutation(char* p,int k){
int n=strlen(p);
if(k==n-1){
cout<<p<<endl;
return;
}
for(int i=k;i<n;i++){
swap(p+k,p+i);
permutation(p,k+1);
swap(p+k,p+i);
}
}
int main(){
char a[]="ABC";
permutation(a,0);
return 0;
}
重复的全排列
代码
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
void swap(char* p,char* q){
char temp=*p;
*p=*q;
*q=temp;
}
void permutation(char* p,int k){
int n=strlen(p);
if(k==n-1){
cout<<p<<endl;
return;
}
set<char> s;
for(int i=k;i<n;i++){
if(s.count(p[i])) continue;
s.insert(p[i]);
swap(p+k,p+i);
permutation(p,k+1);
swap(p+k,p+i);
}
}
int main(){
char a[]="ABBC";
permutation(a,0);
return 0;
}
标准库
- next_permutation(a,a+5)从a字符数组的下一个排序开排(字典顺序),并非全部的排列。如果要得到这些字符的全部排列,则将最小的字典序列作为参数a。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
char a[]="AABBC";
do{
cout<<a<<endl;
}while(next_permutation(a,a+5));
return 0;
}