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+排列组合)