您的位置:首页 > 其它

穷举子集合

2016-04-24 01:47 239 查看
问题描述:给定一个集合,列举出这个结合的所有非空子集合。

例如:{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代码如下:

public class Qjzjh {
public static void fun1(String str){
for(int i=1;i<Math.pow(2,str.length());i++)
{       int a=i;
String ziji="";
for(int j=str.length()-1;j>=0;j--)
{
if((a%2)!=0)ziji=str.charAt(j)+ziji;          //利用十进制转换为二进制的算法,求最后几位二进制
a=a/2;
}
System.out.println(i+"  "+ziji);
}
}

public static void fun2(String str){
for(int i=1;i<Math.pow(2,str.length());i++)
{
String ziji="";
String binary=Integer.toBinaryString(i);         //借助Java自带的方法,将一个整数转换为2进制形式,转换后最高位为1
for(int j=binary.length()-1;j>=0;j--)
{
if(binary.charAt(j)!='0')ziji=str.charAt(j+str.length()-binary.length())+ziji;

}
System.out.println(i+"  "+ziji);
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str="ABC";
fun1(str);
System.out.println();
fun2(str);
}
}


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: