给定一个字符串,如何获得顺序无关紧要的每个子字符串排列

时间:2016-10-28 10:38:18

标签: algorithm brute-force

假设我给了一个字符串“bcdfghjklmnpqrstvwxyz”,我希望从中生成8个字符的长字符串。但是,在谈论每个排列时,我并不关心每个角色的顺序。例如,这个算法应该给我

“bcdfghwx”而不是“cbdfghwx”和其他顺序的变化。我需要一些东西来计算忽略顺序的每个排列。

很抱歉,如果这没有意义,但我想不出更好的解释方法。

编辑:正如评论中所提到的,我需要组合。已经有一段时间了,因为我使用过任何一个术语,对此感到抱歉。

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,这似乎只是一组项目的“获取所有子集”或powerset的问题,这可以通过基本递归来完成:

static void print(int arr[],char values[]){
    for(int i=0;i<arr.length;i++){
        if (arr[i]==1)
            System.out.print(values[i]);
    }
    System.out.println();
}

static void powerSet(int arr[],char values[],int i,int j){
    // base case
    if(i>j){
        print(arr,values);
        return;
    }
    arr[i] = 1;
    // repeat with ith element included
    powerSet(arr,values,i+1,j);
    arr[i] = 0;
    // repeat with ith element excluded
    powerSet(arr,values,i+1,j);
}

public static void main(String[] args) {

    char[] values = {'a','b','c'};
    // use, for example, int array to represent above list
    // i.e. {1,1,1} where '1' represents inclusion in your
    // set. So {1,1,0} would represent {a,b}.


    // initialize arr with 1s
    int[] arr = new int[values.length];
    Arrays.fill(arr, 1);

    powerSet(arr,values,0,values.length-1);

}

输出:

abc
ab
ac
a
bc
b
c

正如您所见,由于排除了空集,因此您将获得(2^n)-1个组合。