Java求一个集合的所有子集

转载请注明出处:

求一个集合的所有子集表示从一个集合当中,任取任意项或不取,所能得到的所有结果,比如有一个集合{a,b,c,d},那么{a,b}, {b, d}等都是它的子集,空集也是它的子集,

 一个具有n 个元素的集合,它的子集共有2^n个,因为对于每个元素都有两种可能:选与不选。

具体的编程思想如下:

package com.example.demo.lettcode;

public class SubSet {

    public static void main(String[] args) {
        char[] charArr = {'a','b','c','d'};
        subSet(charArr);
    }

    /**
     * 思路:将每个元素拆分组合,对每个元素而言,只有两种选择,选中或为选中,从而可以考虑使用二进制的方式。
     *  且由于每个元素在一个组合里面只有两种可能,所以可以得出总共的组合数有  2的n次方。
     *  将2 的n次方进行 循环,每次匹配该值的二进数值,去根据二进制数中的1去匹配数组中的值
     *  从而打印出所有的组合
     *
     * @param charArr
     */
    public static  void subSet(char[] charArr){
        int charLength = charArr.length;
        for (int i = 0; i < (1<<charLength); i++) {
            String setStr = Integer.toBinaryString(i);
            int unChoose = charLength-setStr.length();
            System.out.print("{");
            for (int j = 0; j < setStr.length(); j++) {
                if (setStr.charAt(j)=='1'){
                    // 若数组长度为4,获取0010组合时;setStr = 10 ;元素 unChoose =2,charArr[unChoose+i] = charArr[2+0] = charArr[3] = c
                    System.out.print(charArr[unChoose+j]);
                }
            }
            System.out.println("}");
        }
    }
}

 

posted @ 2022-03-23 23:21  香吧香  阅读(131)  评论(0编辑  收藏  举报