(Java实现) 有重复元素排列问题
有重复元素的排列问题
【问题描述】
设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实现) 有重复元素排列问题的更多相关文章
- java去除数组重复元素的方法
转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...
- Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置
面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...
- 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列
剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...
- java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...
- java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。
import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object o ...
- Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题
该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...
- Java 去除 ArrayList 集合中的重复元素
// One practice package Collection; import java.util.ArrayList; import java.util.Iterator; // 去除 Arr ...
- JAVA取数两个数组交集,考虑重复和不重复元素
1.考虑不重复元素,重复元素不添加 import java.awt.List; import java.util.ArrayList; import java.util.TreeSet; public ...
- 洛谷 P1691 有重复元素的排列问题 解题报告
P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...
随机推荐
- 记录:通过ffmpeg rtsp转 http m3u8
环境 Windows 10 大华rtsp直播 转 http请求m3u8 ffmpeg -rtsp_transport tcp -i "rtsp://账号:密码@IP:端口/cam/realm ...
- 用VirtualBox代替VMWare安装Ubuntu系统图文教程总结
文章目录 为什么使用VirtualBox,而不是VMWare? 图文教程 安装VirtualBox 下载Ubuntu镜像 新建虚拟机 安装Ubuntu系统 总结 为什么使用VirtualBox,而不是 ...
- 内网穿透访问Vue项目的时候出现Invalid Host header解决办法
适用场景: 在本地的Vue-cli3项目, 需要其他人浏览. 如果没有外网的服务器, 可以把自己的电脑当做服务器. 这时候需要外网的人能访问到自己的电脑. Mac内网穿透工具:natapp Inval ...
- 学习docker的一点记录
0x00 docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化 ...
- Java openrasp学习记录(一)
前言: 最近一直在做学校实验室安排的项目,太惨了,没多少时间学习新知识,不过rasp还是要挤挤时间学的,先从小例子的分析开始,了解rasp的基本设计思路,后面详细阅读openrasp的源码进行学习!欢 ...
- linux文档目录
- blazor wasm访问非本地的restful service
准备工作 blazor wasm正式版发布了!在尝试使用的过程中,发现几个小坑,跟大家分享一下,希望有所帮助. 我是通过keycloak来保护blazor和service的,如何保护service请参 ...
- (STL初步)不定长数组:vector
STL是指C++的标准模板库.(存储着一些常用的算法和容器) vector是一个不定长数组.它把一些常用的操作”封装“在vector类型内部. 例如,a是一个vector.1对元素的操作有,可以用a. ...
- Python小技巧:如何批量更新已安装的库?
众所周知,升级某个库(假设为 xxx),可以用pip install --upgrade xxx 命令,或者简写成pip install -U xxx . 如果有多个库,可以依次写在 xxx 后面,以 ...
- VMware虚拟机,vps忘记密码修改密码
因为业务经常会用到虚拟机,然后过不了多久,登录密码就用不了. 解决问题有两种办法,其中一种是通过Dos命令窗:还有一个就是通过制作pe启动盘来操作,进行密码重置,删除等等. 制作pe启动盘的方式有 ...