含有重复元素的排列

Description

设R={ r1, r2, ……, rn }是要进行排列的n个元素。其中元素r1 ,r2 ,……,rn可能相同。试设计一个算法,列出R的所有不同排列。给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。

Input

输入数据的的第1行是元素个数n,1≤n≤500。接下来的1行是待排列的n个元素。

Output

将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数。

Sample Input

4 aacc

Sample Output

aacc 
acac 
acca 
caac 
caca 
ccaa 
6

分析:和普通求全排列问题差不多,只是多了,判断是否重复字符而已。

关于无重复元素的排列,可以参考:http://www.cnblogs.com/huashanqingzhu/p/3569835.html

 1  #include <iostream>
 2  #include <algorithm>
 3  #include <cstdio>
 4  using namespace std ;
 5  long long ans;
 6  int ok(char str[],int a ,int b )
 7  {
 8           if(b>a)
 9            for(int i=a;i<b;i++)
10               if(str[i]==str[b])
11                   return 0;
12            return 1;
13  }
14  void perm(char str[],int k,int m)
15  {
16            int i;
17            if(k==m)
18            {
19               ans++;
20               for(i=0;i<=m;i++)
21                   printf("%c",str[i]);
22               printf("\n");
23               return ;
24            }
25            else for(i=k;i<=m;i++)
26                    if(ok(str,k,i))
27                    {
28                            swap(str[k],str[i]);
29                            perm(str,k+1,m);
30                            swap(str[k],str[i]);
31                    }
32
33  }
34  int main()
35  {
36       char str[505];
37       int n,i;
38       scanf("%d",&n);
39       getchar();
40       ans=0;
41       for(i=0;i<n;i++)
42           scanf("%c",&str[i]);
43       perm(str,0,n-1) ;
44       printf("%lld\n",ans);
45       return 0;
46  }

本文代码来自:http://blog.sina.com.cn/s/blog_9b95c19e0101aqwn.html

时间: 2024-10-13 03:36:33

含有重复元素的排列的相关文章

UVA - 11076 Add Again (重复元素的排列)

Summation of sequence of integersis always a common problem in Computer Science. Rather than computing blindly,some intelligent techniques make the task simpler. Here you have to find thesummation of a sequence of integers. The sequence is an interes

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

[经典面试题]给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1

[题目] 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1. [分析] 此题也就是求target在数组中第一次出现的位置.这里可能会有人想先直接用原始的二分查找,如果不存在直接返回-1, 如果存在,然后再顺序找到这个等于target值区间的最左位置,这样的话,最坏情况下的复杂度就是O(n)了,没有完全发挥出二分查找的优势. 这里的解法具体过程请参考实现代码与注释. [代码] /*********************************

无重复元素的排列

/*========================================================== 设有n个整数的集合{1,2,3,......,n},从中任意选择r个数进行排列. 其中r<n,请列出所有排列. 思路:递归r层,每层选择一个数放到a[].当递归到r层时得到一组排列. 在每一层中做选择的时候,要把所有可能的选择都进行尝试. 具体看代码. ============================================================*/

Python中2维数组/矩阵转化为字典(矩阵中第一列含有重复元素)??

例如将a=[[3,789],[1,100],[1,102],[2,102],[1,106],[2,456]];转化为一个字典b={1:[100,102,102],2:[102,456],3:[789]} 如果用强制转换: 1 >>> a=[[3,789],[1,100],[1,102],[2,102],[1,106],[2,456]]; 2 >>> b=dict(a) 3 >>> b 4 {1: 106, 2: 456, 3: 789} 5 >&

枚举有重复元素的排列的两种方法

我们假设A数组是方案数组,P数组是模板数组. 对于每一种方案,从第一个位置开始放元素,一个一个放. 我们原有的打印全排列的方法是不允许A数组中出现重复元素的,如下代码所示: void dfs(int dp) { if(dp>n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; ans++; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!vis[i

有重复元素的排列问题

问题描述:设R={r1,r2,···,rn}是要进行排列的n个元素.其中元素r1,r2···rn可能相同.试设计一个算法,列出R的所有不同排列 算法设计:给定n及待排列的n个元素,计算出这n个元素的所有不同排列 设计思路:共有m个数的数组,排列到第k位时查看数组下标从k到m的数中是否有数字与下标为k的数字相等,相等的不交换,不相等则交换得新排列 #include<stdio.h> #include<stdlib.h> #include <string.h> void S

Ka的回溯编程练习 Part6.5|详解|有重复元素的排列问题

#include <stdio.h> #define br printf("\n"); int ans=0; char el[502]; int confirm(int i,int k) //往回比较,如果元素有相同跳过此情况 { if(i>k) { while(i>k) { if(el[i]==el[k]) return 0; k++; } } return 1; } void op(int n) { ans++; int j; for(j=0;j<=n

[LintCode] 带重复元素的排列

递归实现: 1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers. 5 * @return: A list of unique permutations. 6 */ 7 vector<vector<int> > permuteUnique(vector<int> &nums) { 8 // write your code here 9 sort(nums.begin(), n