使用位算法求字符串子集

如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]
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值