版权声明:本文为博主原创文章,未经博主允许不得转载。 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
相当于
,表示共有这么多种组合情况,其二进制上的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]
这样就容易懂了。