java 全排列,去重全排列,全组合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 全排列,去重全排列,全组合相关的知识,希望对你有一定的参考价值。
import java.util.ArrayList;
import java.util.List;
public class Test {
ArrayList<List<Integer>> list = new ArrayList<List<Integer>> ();
public List<List<Integer>> permute(int[] nums) {
solve(nums, 0, nums.length-1);
System.out.println(list.toString());
return list;
}
/**
* 算法思想
* 让每一个元素做首个元素,剩下的start+1递归全排列,之后再换回来,恢复初始状态,让下一个元素做首个元素
* @param nums
* @param start
* @param end
*/
public void solve(int[] nums, int start, int end) {
if (start == end) {
list.add(convert(nums));
}
// 每个元素都尝试和第一个元素互换,剩下的再递归
for (int i=start; i<=end; i++) {
// 判断第i个元素是否需要和start互换。从start开始判断到i前一个位置是否有和nums[i]相同的元素,如果有表示该元素做过第一个元素,不需要再进行排列
if (isSwap(nums, start, i)) {
swap(nums, i, start); //
solve(nums, start+1, end);
swap(nums, start, i); // 处理完再换回来
}
}
}
public boolean isSwap(int[] num, int m, int n) {
for (int j=m;j<n;j++) {
if (num[j] == num[n]) {
return false;
}
}
return true;
}
public void swap(int[] nums, int x, int y) {
if (x == y) return;
System.out.println("交换" + x + ":" + y);
int temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
public List<Integer> convert(int[] nums) {
ArrayList<Integer> listTemp = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++) {
listTemp.add(nums[i]);
}
return listTemp;
}
public static void main(String[] args) {
int[] aa = new int[]{1, 2, 3 };
Test n = new Test();
//n.permute(aa);
Character[] ch = new Character[]{'a', 'b', 'c'};
n.solve2(ch);
}
// 全组合 如a,b,c=>a,b,c,ab,ac,bc,abc
/**
* 共有2^n-1个结果。对应于位图 001
* @param arr
* @return
*/
public String[] solve2(Character[] arr) {
int length = arr.length;
int n = 1<<length;
for (int i=1;i<n;i++) {
for (int j=0;j<length;j++) {
if ((i & (1<<j)) > 0) {
System.out.print(""+arr[j]);
}
}
System.out.println();
}
return null;
}
}
以上是关于java 全排列,去重全排列,全组合的主要内容,如果未能解决你的问题,请参考以下文章
C语言的全排列问题!急!
java 字符串全排列 和 去重
贝壳找房计数比赛&&祭facinv
[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)
Java 全排列与组合
Codeforces 991E. Bus Number (DFS+排列组合)