求字符串组合的一个精妙解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32768743/article/details/81745517

自己在做的这个的时候,一直想不明白怎么去解,在网上搜索答案。发现了一个非常精妙的解法,原文是 字符串排列组合——Java实现

我稍微修改了一下代码

    public static List<String> combination(char[] buf) {
        List<String> list = new ArrayList<>();
        for (int i = 1; i < (1 << buf.length); i++) {
            StringBuilder result = new StringBuilder();
            for (int j = 0; j < buf.length; j++)
                if ((i & (1 << j)) != 0) result.append(buf[j]);
            list.add(result.toString());
        }
        return list;
    }

原文中,说了技巧。1<<buf.length相当于 2 b u f . l e n g t h ,表示共有这么多种组合情况,其二进制上的1表示每种情况取哪些字母。i & (1<<j)表示实际哪一位为1,取哪些位置的组合。这些技巧在JDK里是有一些运用的。

开始我总是想不通,于是又改了些代码,得到下面的输出
(以abc为例)

  1   a
 10   b
 11  ab
100   c
101  ac
110  bc
111 abc
[a, b, ab, c, ac, bc, abc]

这样就容易懂了。

猜你喜欢

转载自blog.csdn.net/qq_32768743/article/details/81745517