有重复元素的全排列
2011-07-31 20:41
148 查看
Description
输入n(<=10)个小些字母(可能重复),输出n个字符的全部排列。
Input
abaab
Output
1:aaabb
2:aabab
3:aabba
4:abaab
5:ababa
6:abbaa
7:baaab
8:baaba
9:babaa
10:bbaaa
输入n(<=10)个小些字母(可能重复),输出n个字符的全部排列。
Input
abaab
Output
1:aaabb
2:aabab
3:aabba
4:abaab
5:ababa
6:abbaa
7:baaab
8:baaba
9:babaa
10:bbaaa
#include<stdio.h> #include<string.h> char a[11]; char p[11]; int leap; //标记个数 void qsort(char num[],int shangbiao,int xiabiao) //将字符排序 { int i=shangbiao,j=xiabiao; int key=i; char t; if(shangbiao<xiabiao) { while(i<j) { for(;j>key;j--) { if(num[j]<num[key]) { t=num[j]; num[j]=num[key]; num[key]=t; key=j; break; } } i++; for(;i<key;i++) { if(num[i]>num[key]) { t=num[i]; num[i]=num[key]; num[key]=t; key=i; break; } } j--; } qsort(num,shangbiao,key-1); qsort(num,key+1,xiabiao); } } void print_permutation(int n,char *p,char *a,int cur) //重复元素排列 { int i,j; int ok=1; int c1=0,c2=0; if(cur==n) { leap++; printf("%d:",leap); for(i=0;i<n;i++) printf("%c",a[i]); printf("\n"); } else for(i=0;i<n;i++) { if(!i||p[i]!=p[i-1]) //判断与前一个元素不相同 { c1=0;c2=0; for(j=0;j<cur;j++) if(a[j]==p[i]) c1++; for(j=0;j<n;j++) if(p[i]==p[j]) c2++; if(c1<c2) { a[cur]=p[i]; print_permutation(n,p,a,cur+1); } } } } int main() { int n; gets(p); n=strlen(p); qsort(p,0,n-1); print_permutation(n,p,a,0); return 0; }
相关文章推荐
- 包含重复元素的全排列
- 全排列_问题(含重复元素)
- DFS-带重复元素的全排列
- 【ZOJ】3841 Card (搜索+组合数学(重复元素的全排列)
- 计数与概率基础(容斥、有重复元素的全部排列、可重复选择的全排列、杨辉、二项式定理、欧拉函数)
- leetcode-46. Permutations(非重复元素全排列)
- 递归实现全排列(可包含重复元素)
- 面试题------全排列的非递归和递归实现(含重复元素)
- 如何得到有重复元素的不重复全排列
- 含有重复元素的全排列
- 对有重复元素的字符串进行全排列
- 有重复元素的全排列
- SSL JudgeOnline 1357——有重复元素的全排列
- 集合的全排列(可包含重复元素)
- 全排列(含有重复元素)
- UVA 11076 Add Again(有重复元素的全排列问题)
- LintCode 15-全排列 16-带重复元素的全排列
- 九章算法面试题54 带重复元素的全排列
- leetcode-47. Permutations II(重复元素全排列)
- 求输入字符串的全排列 (无重复元素)