我需要生成一个字符串的所有可能组合,使用多线程在N个线程之间平均分配工作。所以字符串cat
将输出:
c, a, t, ca, ct, ac, at, ta, tc, cat, cta, tac, tca, act, atc
每个线程都包含startIndex
和endIndex
,并对字符串进行不同的处理。现在我可以生成一个字符串的所有排列但我绝对难以理解我需要做什么来修改它以获得所有组合。任何帮助将不胜感激。
这就是我现在所拥有的:
public void run() {
for(int i = startIndex; (i < endIndex); i++) {
swap(word, 0, i); // Swap character to zero location.
permuteAndCheck(word, 1); // Recursively check permutations
swap(word, 0, i); // Undo swap
}
}
private void permuteAndCheck(char[] word, int start) {
if (start < word.length) {
// Not yet at the deepest recursion level to compare permutations.
for(int i = start; (i < word.length); i++) {
swap(word, start, i);
permuteAndCheck(word, start + 1);
swap(word, start, i); // Restore entry back from previous swap
}
return;
}
System.out.print(word + ", ");
}
private static final void swap(char[] word, int index1, int index2) {
char temp = word[index1];
word[index1] = word[index2];
word[index2] = temp;
}
答案 0 :(得分:0)
如果您正在寻找所有组合(即字符的幂集),那么您已经知道有2 ^ k种可能性,k是字符数。
第一个线程然后处理第1个到第(2 ^ k)个/第N个组合,第二个线程处理1 +(2 ^ k)/第N到2 *(2 ^ k)/第N个组合,等。
要获取第j个字符串,请查看j的二进制表示,并获取相应数字为“1”的字符。即第5个(二进制:101)“cat”的组合是c_t。