找到具有大于或等于2的子集的数组的所有子集

时间:2018-05-15 10:29:46

标签: java algorithm bit-manipulation

以下代码打印所有子集,但我需要大小大于或等于2.

public static void printSubsets(char set[])
{
    int n = set.length;

    for (int i = 0; i < (1<<n); i++)
    {
        System.out.print("{ ");

        for (int j = 0; j < n; j++)

            if ((i & (1 << j)) >0 )
                System.out.print(set[j] + " ");

        System.out.println("}");
    }
}

1 个答案:

答案 0 :(得分:4)

大小为0的子集对应i == 0。要消除空子集,请从i = 1开始。

大小为1的子集对应于i,其中只有一位设置;或等效地,当它是2的幂时。如果(i & (i - 1)) == 0,则为正数i is a power of two

for (int i = 1; i < (1<<n); i++) {
    if ((i & (i - 1)) == 0) {
        continue;
    }

    System.out.print("{ ");

    for (int j = 0; j < n; j++) {
        if ((i & (1 << j)) != 0) {
            System.out.print(set[j] + " ");
        }
    }

    System.out.println("}");
}

或者,您可以保留原始循环并简单地插入此检查:

if (Integer.bitCount(i) < 2) {
    continue;
}

它不那么聪明或有效,但它很好且可读。