含重复元素的全排列

时间:2022-06-20 19:12:30


借鉴自:Loyalch的博客

             jeiwt的专栏


算法思想:递归

input: 字符数组str[],例如:str[] = {a,a,b,b,c};

先对输入序列str[]排序,输出序列A[]可以看成A[0] + A[1...Len] 组合而成,而其中A[0]可以是a[0...len]中不同的数。若是a[i]被选中作为a[0],则可以当做str[0]与str[i]交换;

同理A[1...Len]又可以是由A[1] + A[2...Len]组合而成,其中A[1]可以是a[1...Len]中不同的数,如上。

代码:

 #include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
long long ans;
int ok(char str[],int a ,int b )
{
if(b>a)
for(int i=a;i<b;i++)
if(str[i]==str[b])
return 0;
return 1;
}
void perm(char str[],int k,int m)
{
int i;
if(k==m)
{
ans++;
for(i=0;i<=m;i++)
printf("%c",str[i]);
printf("\n");
return ;
}
else for(i=k;i<=m;i++)
if(ok(str,k,i))
{
swap(str[k],str[i]);
perm(str,k+1,m);
swap(str[k],str[i]);
}
}
int main()
{
char str[505];
int n,i;
scanf("%d",&n);
getchar();
ans=0;
for(i=0;i<n;i++)
scanf("%c",&str[i]);
perm(str,0,n-1) ;
printf("%lld\n",ans);
return 0;
}