有重复元素的排列问题

【问题描述】

设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. 【漫画】JAVA并发编程 J.U.C Lock包之ReentrantLock互斥锁

    在如何解决原子性问题的最后,我们卖了个关子,互斥锁不仅仅只有synchronized关键字,还可以用什么来实现呢? J.U.C包中还提供了一个叫做Locks的包,我好歹英语过了四级,听名字我就能马上大 ...

  2. [hdu4713 Permutation]DP

    题意:将一个数拆成若干数的和使得它们的最小公倍数最大 思路:一个数x可以拆成p1k1 + p2k2 + ... + pnkn形式,其中pi是质数或1.对于最小公倍数最大的情况,一定可以表示成这种形式. ...

  3. 浅析微软的网关项目 -- ReverseProxy

    浅析微软的网关项目 ReverseProxy Intro 最近微软新开了一个项目 ReverseProxy ,也叫做 YARP(A Reverse Proxy) 官方介绍如下: YARP is a r ...

  4. 使用js rem动态改变字体大小,自适应

    <html> <head> <meta charset="utf-8"> <script> console.log(window.d ...

  5. python-修改文件

    1.修改文件1 # fw = open('username','w')# fw.write('hhhh')# fw.flush()  #强制把缓冲区里面的数据写到磁盘上1.简单粗暴直接#  1.打开一 ...

  6. 笨办法学习python-ex51自我理解笔记

    本章节主要讲的是web的工作原理,先大概熟悉记录一下,为以后写Django web框架打下基础. web工作原理: 1.用户从浏览器输入网址----->browser通过电脑中的网络设备(网卡) ...

  7. python装饰器在接口自动化测试中的应用

    在讲解装饰器在接口自动化测试项目的应用之前,我们先来介绍一下python装饰器到底是个什么 装饰器 说装饰器就不得不提一下函数这个一等公民了,在python中函数有几个特性先来了解一下 函数的一些特性 ...

  8. @vue/cli 4.0+express 前后端分离实践

    之前总结过一篇vue-cli 2.x+express+json-server实现前后端分离的帖子,@vue/cli3.0及4.0搭建的项目与vue-cli2.x的项目结构有很大的不同.这里对@vue/ ...

  9. Git基本操作命令合集

    平时自己敲敲代码,使用Git命令也渐渐多了起来.使用起来的确很方便,今天来分享下Git基本概念和本地代码提交到github上的过程,很简单的,多操作几次就会了. Git定义 Git 是一个开源的分布式 ...

  10. C语言合法标识符(hud2024)

    输入方式:先输入一个整型,再循环输入带空格的字符串. 思考:整型用scanf_s()输入.大循环输入字符串前用getchar()函数读取缓冲区的字符.然后,输入带空格的字符串就要用”gets_s()“ ...