全排列(有重复)
上一部分的全排列是无重复的,咱们遍历的条件就是想办法让每一个数字只选择一次,选择过了 ,咱们就不选,利用continue跳过,但是如果有重复数字在里面,我们恐怕就不能用数字是否重复来判断这个数字是否选择了,如果这样判断的话,我们数字会永远缺了重复的那个数字。
整体思路:
整体思路其实就是上一部分无重复的全排列思路非常像,我们开始利用的是数字不重复来选取需要的数字,那么我们现在可以通过序号是否取过,取过咱们就不要,也就是说,另外开取一个容器,来装取出数字的序号,然后判断这个序号是否取过了,如果取过了,咱们就退出
整个代码就是:
public class number{
static ArrayList
<String> w
= new ArrayList();
static List
<Integer> M
= Arrays
.asList(1,2,3,5);
public static void run(ArrayList
<Integer> selected
,List
<Integer> choose
,ArrayList
<Integer> to
) {
if(selected
.size() == choose
.size()) {
w
.add(Arrays
.toString(selected
.toArray()));
return;
}
for(int i
=0;i
<choose
.size();i
++) {
Integer num
= choose
.get(i
);
Integer a
= i
;
if(to
.contains(a
)) {
continue;
}
to
.add(a
);
selected
.add(num
);
run(selected
,choose
,to
);
to
.remove(a
);
selected
.remove(num
);
}
}
public static void main(String
[] args
) {
ArrayList
<Integer> selected
= new ArrayList();
ArrayList
<Integer> to
= new ArrayList();
run(selected
,M
,to
);
for(int i
=0;i
<w
.size();i
++) {
System
.out
.println(w
.get(i
));
}
}
}
代码整体一看,感觉似乎差不多的代码,只是多加了一个to容器来存储数字本该有的序列而已,用了另外一种形式来挑选数字, 数字不同时,也是另外一种判断方式,但是数字相同时,就会发现很多组数字都重复了,因为他们是按照序列来排序的,而不是看你数字来排序的,这个时候还需要再筛选一次
去除重复序列
去除重复序列只需要判断一下存储字符串的容器当中,有没有存储过这一个字符串,如果存过了,就跳过去,不存进去,java自配的容器,非常好使。这串代码只需要在判断return处加上就可以了。
if(selected
.size() == choose
.size()) {
if(w
.contains(Arrays
.toString(selected
.toArray()))==false) {
w
.add(Arrays
.toString(selected
.toArray()));
}
return;
}
这样就剔除了重复的字符串,但是如果想要更干净一点的代码,把两边的框框去掉,可以利用replaceAll把[ ]给换掉
最终代码:
public class number{
static ArrayList
<String> w
= new ArrayList();
static List
<Integer> M
= Arrays
.asList(1,2,2,5);
public static void run(ArrayList
<Integer> selected
,List
<Integer> choose
,ArrayList
<Integer> to
) {
if(selected
.size() == choose
.size()) {
if(w
.contains(Arrays
.toString(selected
.toArray()).replaceAll("\\[|\\]", ""))==false) {
w
.add(Arrays
.toString(selected
.toArray()).replaceAll("\\[|\\]", ""));
}
return;
}
for(int i
=0;i
<choose
.size();i
++) {
Integer num
= choose
.get(i
);
Integer a
= i
;
if(to
.contains(a
)) {
continue;
}
to
.add(a
);
selected
.add(num
);
run(selected
,choose
,to
);
to
.remove(a
);
selected
.remove(num
);
}
}
public static void main(String
[] args
) {
ArrayList
<Integer> selected
= new ArrayList();
ArrayList
<Integer> to
= new ArrayList();
run(selected
,M
,to
);
for(int i
=0;i
<w
.size();i
++) {
System
.out
.println(w
.get(i
));
}
}
}