列出所有排列& Integer Arraylist中的组合递归

时间:2014-01-11 04:05:24

标签: java algorithm arraylist

我有一个方法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]等...

2 个答案:

答案 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()的需求应该是一个暗示。应保留suba值(其位置和值)以便正常运行。

下面的代码创建了一个新的数组列表副本并对它们进行操作:

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);
         }
     }
 }