转载请注明出处:
求一个集合的所有子集表示从一个集合当中,任取任意项或不取,所能得到的所有结果,比如有一个集合{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("}"); } } }
标签: 算法与数据结构