/** * 给定一个集合(字符数组),打印出它的所有子集 * @param set - 给定的集合(字符数组) */ public void showAllSubset(char[] set) { boolean[] flags = new boolean[set.length]; //若第i个元素为true,则表示集合中第i个元素被选中 int count = 0; //记录集合中被选中元素的总数 int cur = 0; //当前正在考察的集合中元素的位置 System.out.println("{ Φ }"); //首先输出空集 for(int i=1; i<=set.length; i++) { //寻找子集的时候,长度依次递增,即i=2表示寻找所有长度为2的子集 //每次刚开始寻找长度为i的子集的时候,做一些初始化操作 Arrays.fill(flags, false); //flags数组初始化为false,表示集合中没有任何元素被选中 count = 0; //被选中元素总数清零 cur = 0; //准备从第一个元素开始考察 while(true) { //开始寻找所有长度为i的子集 if(count==i) { //如果已经选中了i个元素,则表明已经找到了一个子集 printSubset(flags, set); //打印出这个子集 //如果当前元素已超出数组范围,并且距离子集的第一个元素的距离为i //则表明这是当前长度下最后一个子集,不必再继续寻找了,跳出循环 if(cur==set.length && cur-findFirstFlag(flags)==i