假设我给了一个字符串“bcdfghjklmnpqrstvwxyz”,我希望从中生成8个字符的长字符串。但是,在谈论每个排列时,我并不关心每个角色的顺序。例如,这个算法应该给我
“bcdfghwx”而不是“cbdfghwx”和其他顺序的变化。我需要一些东西来计算忽略顺序的每个排列。
很抱歉,如果这没有意义,但我想不出更好的解释方法。
编辑:正如评论中所提到的,我需要组合。已经有一段时间了,因为我使用过任何一个术语,对此感到抱歉。
答案 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
个组合。