如String str = acd,转化为二进制strBitMask:1101 ,1代表有该元素,0代表无该元素;
则1101对应的子集应该是0000,0001,0100,0101,1000,1001,1100,1101
·如何求得他们呢?
思路,利用循环int temp= strBitMask&-strBitMask 遍历获取低位元素,然后存储,
得到的元素,然后和之前的元素和子集元素进行 | 操作,得到新的子集。
遍历完时,所有子集也就出来了。
即:
0001
0100
0001 | 0100 =0101
1000
0001 | 1000=1001
0100| 1000=1100
0101|1000=1101
共七个(不计入空集)
转二进制
//转二进制
private static int getBitMask(String word,int k) {
/*a 1
ab 11
ac 101
acd 1101
* */
int mask = 0;
for (int i = k; i < word.length(); i++) {
char ch = word.charAt(i);
mask = mask | (1 << (ch - 'a'));
}
return mask;
}
获取子集
//获取子集
private static ArrayList<Integer> getSubset(int word) {
ArrayList<Integer> arr = new ArrayList<>();
while (true){
int temp =-word&word;
if (arr.size()>0){
for (int i = 0; i <arr.size(); i++) {
int tt=arr.get(i)|temp;
//去空集,去重复子集
if (tt!=0&&arr.get(i)!=tt){
arr.add(tt);
}
}
}
arr.add(temp);
//更新word的最低位“1”
word=word-temp;
if (word==0)break;
}
return arr ;
}
测试
public static void main(String[] argss) {
int a=7;
ArrayList<Integer> getzi = getSubset(a);
System.out.println(getzi);//输出[1, 3, 2, 5, 7, 6, 4]
}