生成可重集的排列(字典排序)
描述:给出一个数组S,按字典排序输出所有的序列
此时不在局限于数字,可以是字符
可以改进生成1--n全排列的代码,但是问题是当S有重复元素时候不能解决问题
出现重复:
#include<iostream> using namespace std; int p[100]={0}; char ans[100]; char arr[100]; void gcd(int n,int cur,int p[]){ int i,j; if(cur==n){ for(i=0;i<n;i++) cout<<ans[i]; cout<<endl; } for(i=0;i<n;i++){ if(!p[i]) { ans[cur]=arr[i]; p[i]=1; gcd(n,cur+1,p); p[i]=0; } } } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>arr[i]; gcd(n,0,p); }
next_permutation的使用,可以避免重复
#include<iostream> #include<algorithm> using namespace std; int main() { int ans[4]={1,2,3,4}; sort(ans,ans+4); /* 这个sort可以不用,因为{1,2,3,4}已经排好序*/ do /*注意这步,如果是while循环,则需要提前输出*/ { for(int i=0;i<4;++i) cout<<ans[i]<<" "; cout<<endl; }while(next_permutation(ans,ans+4)); return 0; }
C++描叙
#include<iostream> #include<algorithm> using namespace std; int main() { string str; cin>>str; int len=str.length(); sort(str.begin(),str.end()); while(next_permutation(str.begin(),str.end())){ cout<<str<<endl; } }