我想生成一组n个事物中所有可能的团队,例如“abcd”= ab,ac,ad ......没有重复。我写了这个,但它生成了一个字符串的所有排列。我写了一个方法来检查两个字符串是否有相同的字符,但我不知道这是否正确。
package recursion;
import java.util.Arrays;
public class Permutations2 {
public static void main(String[] args) {
perm1("", "abcd");
System.out.println(sameChars("kostas","kstosa"));
}
private static void perm1(String prefix, String s) {
int N = s.length();
if (N == 0){
System.out.println(prefix);
}
else {
for (int i = 0; i < N; i++) {
perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N));
}
}
}
private static boolean sameChars(String firstStr, String secondStr) {
char[] first = firstStr.toCharArray();
char[] second = secondStr.toCharArray();
Arrays.sort(first);
Arrays.sort(second);
return Arrays.equals(first, second);
}
}
答案 0 :(得分:3)
您正在描述power set。
番石榴有implementation。
答案 1 :(得分:0)
您是否想要Enumerating k-combinations。
private static void combinate(String s, String prefix, int k) {
if (s.length() < k) {
return;
} else if (k == 0) {
System.out.println(prefix);
} else {
combinate(s.substring(1), prefix + s.charAt(0), k - 1);
combinate(s.substring(1), prefix, k);
}
}
public static void main(String[] args) {
combinate("abcd", "", 2);
}
输出:
ab
ac
ad
bc
bd
cd
请参阅Introduction to Programming in Java - Recursion - Robert Sedgewick and Kevin Wayne
答案 2 :(得分:0)
这应该没有递归工作:
private static void perm(String s) {
char[] arr = s.toCharArray();
for (int i = 0; i < s.length() - 1; i++) {
for(int j = i + 1; j < s.length(); j++) {
System.out.println(String.valueOf(arr[i]) + String.valueOf(arr[j]));
}
}
}
这是O(n ** 2)。