我有一个方法perm1
,用于打印字符串中所有字符的排列/组合
// print permutation / combination of the characters of the string s (in order)
public static void perm1(String s) { perm1("", s); }
private static void perm1(String prefix, String s) {
int N = s.length();
if (N == 0) System.out.println(prefix);
else {
System.out.println(prefix);
for (int i = 0; i < N; i++)
perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N));
}
}
perm1
正常工作并产生所需的输出。
我正在尝试创建一个类似的方法perm2
,它适用于整数的arraylist
public static void perm2(ArrayList<Integer> a) {
ArrayList<Integer> sub = new ArrayList<Integer>();
perm2(sub, a);
}
public static void perm2(ArrayList<Integer> sub, ArrayList<Integer> a){
int L = a.size();
if (L==0) System.out.println(sub);
else {
System.out.println(sub);
for (int i = 0; i < L; i++){
sub.add(a.get(i));
a.remove(i);
perm2(sub, a);
L = a.size(); // to avoid Index out of bounds exception
}
}
}
这并不像我希望的那样产生所有的排列和组合。使用arraylist [1,2,3],它只打印以下内容:
[]
[1]
[1, 2]
[1, 2, 3]
任何人都可以告诉我如何修改perm2,以便打印其他预期值,如[2] [3] [2,3] [3,2] [2,3,1] [2,1, 3]等...
答案 0 :(得分:3)
我强烈建议查看Google的Guava软件包:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Collections2.html
这个包有非常有用的方法“permutations(Collection elements)”
此软件包还包含“Sets”类中的“powerSet(Set set)”方法。 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Sets.html
嵌入对powerSet(Set)和permutations(Collection)的调用应该会让事情变得非常简单。
答案 1 :(得分:2)
对L=a.size()
的需求应该是一个暗示。应保留sub
和a
值(其位置和值)以便正常运行。
下面的代码创建了一个新的数组列表副本并对它们进行操作:
public static void perm2(ArrayList<Integer> a) {
ArrayList<Integer> sub = new ArrayList<Integer>();
perm2(sub, a);
}
public static void perm2(ArrayList<Integer> sub, ArrayList<Integer> a) {
int L = a.size();
if (L == 0) System.out.println(sub);
else {
System.out.println(sub);
for (int i = 0; i < L; i++) {
ArrayList<Integer> ab = new ArrayList<Integer>(sub);
ab.add(a.get(i));
ArrayList<Integer> bc = new ArrayList<Integer>(a);
bc.remove(i);
perm2(ab, bc);
}
}
}