穷举子集合

问题描述:给定一个集合,列举出这个结合的所有非空子集合。

例如:{A,B,C},非空子集合为:{A}{B}{C}{AB}{AC}{BC}{ABC}

这里采用编码的算法,就是为每一位进行编码,0表示对应的元素不出现,1表示对应的元素出现。

那么ABC对应的编码为

0.    000            {}

1.    001            {C}

2.    010           {B}

3.    011           {BC}

4.    100           {A}

5.    101           {AC}

6.    110           {AB}

7.    111           {ABC}

这里提供两种方法,

       第一种方法fun1是自己手动将其对应的二进制位求出来,这种方法更加通用,推荐大家掌握这种方法。

       第二种方法fun2是利用Java自带的包,可以将指定的整数转换为二进制形式。

Java代码如下:

 1 public class Qjzjh {
 2     public static void fun1(String str){
 3         for(int i=1;i<Math.pow(2,str.length());i++)
 4         {       int a=i;
 5                 String ziji="";
 6              for(int j=str.length()-1;j>=0;j--)
 7                  {
 8                     if((a%2)!=0)ziji=str.charAt(j)+ziji;          //利用十进制转换为二进制的算法,求最后几位二进制
 9                     a=a/2;
10                  }
11              System.out.println(i+"  "+ziji);
12         }
13     }
14     
15     public static void fun2(String str){                        
16         for(int i=1;i<Math.pow(2,str.length());i++)
17         {   
18                 String ziji="";
19                 String binary=Integer.toBinaryString(i);         //借助Java自带的方法,将一个整数转换为2进制形式,转换后最高位为1
20                 for(int j=binary.length()-1;j>=0;j--)
21                  {
22                     if(binary.charAt(j)!='0')ziji=str.charAt(j+str.length()-binary.length())+ziji;
23                     
24                  }
25              System.out.println(i+"  "+ziji);
26         }
27     }
28     public static void main(String[] args) {
29         // TODO 自动生成的方法存根
30         String str="ABC";
31         fun1(str);
32         System.out.println();
33         fun2(str);
34     }
35 }
View Code

输出结果为:

1 C
2 B
3 BC
4 A
5 AC
6 AB
7 ABC

1 C
2 B
3 BC
4 A
5 AC
6 AB
7 ABC

原文地址:https://www.cnblogs.com/guozhenqiang/p/5426227.html