输出该字符串中字符的所有组合

输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc
   这题目估计大家都不陌生了,网上很多都一个递归方法解决,现在介绍一种非主流解决方法,来,让我们看代码:
  

 
    /**
     * @param args
     */
    public static void main(String[] args) {
        String temp = "abcdefghijklnmopqrstu";
        String[] results = getResult(temp);
    }

    private static String[] getResult(String str){
        int start = 1;
        int strSize = str.length();
      
        double max = Math.pow(2, strSize-1);
        double total = Math.pow(2, strSize)-1;
        String[] result = new String[(int)total];
        int step;
        int index;
        StringBuilder sb;
        while (start <= total) {
            sb = new StringBuilder();
            step = 1;
            index = 0;
            while (step <= max) {
                int temp = step & start;
                if (temp != 0) {
                    sb.append(str.charAt(index));
                }
                step <<= 1;
                index++;
            }
            result[start -1] = sb.toString();
            start++;
        }
        return result;
    }

     上面的总体思路是酱紫的:n个字符的所有组合个数就是2^n  -1 个。既然我们可以知道总数,那么不妨把这些数字换成二进制码,就有2^n  -1组二进制码,细心观察这些0101的二进制码,我们就会发现里面隐藏着一个规律,那就假如我们把那组二进制跟我们的字符串联想在一起,然后把出现1的位置的字符连起来,不就是对应其中一种组合情况吗?换种说法,那2^n  -1个数所对应的二进制码,就是我们要的组合啊。那么接下来我们只需要把里面1的索引位置找出来,把字符串里面对应索引的字符取出来拼在一起就行了~~ 当然我觉得这里还有优化的余地,例如如何更快地找出1所在的位置之类~~
     还有,假如目标字符串是26个字母,这种算法列出组合,比网上的那些递归方法快差不多一倍(前提条件是不记录结果,或者直接输出结果,因为记录所有结果需要大量内存,不加内存会爆的........)~~~

你可能感兴趣的:(输出该字符串中字符的所有组合)