有重复元素的排列问题

【问题描述】

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

【编程任务】

给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。

【输入格式】

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

【输出格式】

计算出的n个元素的所有不同排列输出。文件最后1行中的数是排列总数。

【输入样例】

4

aacc

【输出样例】多解

aacc

acac

acca

caac

caca

ccaa

6

解题思路:单从排列的所有可能数出发,可以直接使用



其中M为字符总数,ni表示其中重复字符数。但是考虑到需要把所有可能的排列结果输出,所以还需遍历所有可能的排序,

最后统计所有可能排序的总数。假设,没有重复字符的情况,则是对应M个位置,每个位置所有可能字符数的乘积M!即为排列总数。

现在有重复元素,同样借助无重复字符排序方式来求解。首先有重复字符串构成一个无重复字符的字符串,

同时为新串用一个辅助数组表示每个字符出现的次数。即abbac,排列成无重复序列abc,辅助数组为221。然后采用回溯法,

先建立一个字符长度的数组,该数组的每一个位置都从无重复序列中选择一个可能的字符,每次选出一个字符,

则辅助数组与该字符对应减一,表示该字符可用数减一。直到最后一个字符,每次到最后一个字符的时候,

计数器count++同时把此时数组中排序的字符串输出,即为可能的排序。

然后回溯到上一个位置遍历上次递归选出的无重复串中的下一个字符递归直到最后一个字符后(这里递归下去后,也会回溯),

又往上回溯一步。这里一开始对初始化的字符串重新排列的原因就是为了在回溯到上一步时,

保证选出的下一个字符与上一次递归选取的字符不同。

例如abbac abc 221

递归到最后:aabbc

第一次回溯:aabcb

第二次回溯:aacbb

第三次回溯:ababc abacb abbac abcab abcba …

第四次回溯:baacb baabc …

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set; public class youchongfuyuansudepailiewenti {
static Set<String> set = new HashSet<String>();
public static int n;
public static char [] num1;
public static boolean [] bool;
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
n = sc.nextInt();
String s = sc.next();
num1 = s.toCharArray();
char [] num = new char [num1.length];
bool = new boolean [num1.length];
// String [] num = new String [num1.length+1];
// for (int i = 1; i < num.length; i++) {
// num[i]=num1[i-1];
// }
f(0,num);
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println(set.size());
}
public static void f(int a,char [] num){
if(a==n){
String s = "";
for (int i = 0; i < num.length; i++) {
s= s+num[i];
}
set.add(s);
return;
}
for (int i = 0; i < num.length; i++) {
if(!bool[i]){
bool[i]=true;
num[a]=num1[i];
f(a+1,num);
bool[i]=false;
num[a]=0;
}
}
} }

(Java实现) 有重复元素排列问题的更多相关文章

  1. java去除数组重复元素的方法

    转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...

  2. Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置

    面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...

  3. 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

    剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...

  4. java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

    import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...

  5. java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。

    import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object o ...

  6. Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

    该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...

  7. Java 去除 ArrayList 集合中的重复元素

    // One practice package Collection; import java.util.ArrayList; import java.util.Iterator; // 去除 Arr ...

  8. JAVA取数两个数组交集,考虑重复和不重复元素

    1.考虑不重复元素,重复元素不添加 import java.awt.List; import java.util.ArrayList; import java.util.TreeSet; public ...

  9. 洛谷 P1691 有重复元素的排列问题 解题报告

    P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...

随机推荐

  1. Flutter 标签类控件大全Chip

    老孟导读:Flutter内置了多个标签类控件,但本质上它们都是同一个控件,只不过是属性参数不同而已,在学习的过程中可以将其放在放在一起学习,方便记忆. RawChip Material风格标签控件,此 ...

  2. STM32 IAP 升级官方资料汇总

    整理了一下SMT32标准外设库进行IAP升级的官方demo: 标准库版本 STM32F10xxx in-application programming using the USART (AN2557) ...

  3. CF#637 C. Nastya and Strange Generator

    C. Nastya and Strange Generator 题意 有一个随机全排列生成器,给出你一个全排列,让判断是否可以通过这个生成器产生. 生成器工作方式: 第i步为数字i寻找位置pos. 首 ...

  4. 《C程序设计语言》 练习2-8

    问题描述 练习 2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值. Write a function rightr ...

  5. 【基准测试】BenchmarkDotNet介绍

    BenchmarkDotNet 概述 BenchmarkDotNet helps you to transform methods into benchmarks, track their perfo ...

  6. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  7. mysqldump 参数--single-transaction

    其实很简单,single-transaction可以让mysqldump 的时候不锁表.但是他有3个前提 innodb的引擎 不能在执行的同时,有其他alter table ,drop table,r ...

  8. yield与park的区别

    yield表示放弃本次cpu的时间片,但是操作系统在下一个时间片依旧可能会调用该线程/进程 park表示线程/进程睡眠,需要让其他线程/进程唤醒,才有可能重新被操作系统分配时间片, 非自旋锁,底层一般 ...

  9. mysql基础1:yum安装mysql

    1.下载yum源并安装http://dev.mysql.com/downloads/repo/yum/.wget https://dev.mysql.com/get/mysql57-community ...

  10. python3.x 基础四:json与pickple

    每次打开一个文件,只dump1次 json.dump(dump的内容,文件句柄) json.load(文件句柄) json可以处理列表/字典/字符串等简单数据类型,但是不能处理复杂的数据类型,如函数的 ...