算法|含重复元素的排列问题
问题描述:
设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。
大致思路:
求含重复元素的排列问题,首先先求出不含重复元素的全排列。根据分治法,我们求n个元素的全排列,可以求出n-1个元素的全排列,然后再加上n的排列即可,当只有一个元素的时候,只有一种排列。然后依次合并子问题的解。
然后我们只要在此基础上加一个判断条件将重复的排列筛选掉即可。
【算法|含重复元素的排列问题】
/****************有重复元素的排列问题**************************************/
#include
#include
#include
#include
#include
#include
using namespace std;
char a[100];
///待排列的字符串
int num;
///排列数
void swap(int i,int j){///交换两个元素
char tmp;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
bool isok(int b,int i){///判断是否重复
if(i > b){
for(int t = b;
t < i;
++t){
if(a[t] == a[i]) return false;
}
}
return true;
}
void pailie(char s[],int begin,int end){///递归排列函数
if(begin == end){///剩余一个元素返回,打印结果
num++;
printf("%s\n",s);
return;
}
for(int i = begin;
i < end;
i++){///多于一个元素递归求解
if(isok(begin,i)){
swap(begin,i);
pailie(s,begin+1,end);
swap(begin,i);
}}
return;
}
int main()
{
scanf("%s",a);
int l = (int)strlen(a);
pailie(a,0,l);
printf("%d\n",num);
system("pause");
return 0;
}
///abcd
///aacc
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- 社保代缴公司服务费包含哪些
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- Java|Java基础——数组
- 《算法》-图[有向图]
- 小小诗九则
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 虚拟DOM-Diff算法详解