Java - 数组元素的排列 - 清楚地解释

时间:2013-10-08 19:05:34

标签: java arrays permutation

我有一个整数数组,需要使用Java找到这些元素的所有可能排列。所以我最后会有一个包含数组的数组,其中每个数组都是原始单个数组的排列。它必须适用于任何大小的数组。

我可以为一个字符串做这个,但数组正在绊倒我。我的元素是整数,所以我不能使用简单的字符串方法,例如,如果我的整数是1,2,14我会置换字符串1214.是否可以操纵字符串并置换它,然后得到最后以某种方式过滤我所需的排列?

我环顾四周,似乎找到了一些算法,但实际上所有这些算法都只是代码大量,几乎没有任何解释,所以我无法理解它们。有没有人有这样的算法,这是一个解释的算法!?

这是我的字符串算法:

static String[] getPermutations( String str ) { 
List<String> perms = new ArrayList<>();
    permute( "", str, perms );
    String[] list = perms.toArray( new String[ perms.size() ] );
    return list;
}

// This function recursively calls itself
static void permute( String prefix, String str, List<String> perms ) {
        int n = str.length();
        if ( n == 0 ) {
        perms.add(prefix);
        } else {
            for ( int i = 0; i < n; i++ ) {
            permute( prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), perms );
        }
    }
}

1 个答案:

答案 0 :(得分:0)

对于permute方法这样的东西。显然,必须对getPermutations方法进行相关更改。逻辑与String示例实际上是一样的。

static void permute( List<Integer> prefix, List<Integer> ints, List<List<Integer>> perms ) {
        int n = ints.size();
        if ( n == 0 ) {
        perms.add(prefix);
        } else {
            for ( int i = 0; i < n; i++ ) {
                List<Integer> newPrefix = new ArrayList<Integer>();
                List<Integer> newInts = new ArrayList<Integer>();
                Collections.copy(prefix, newPrefix);
                Collections.copy(ints, newInts);

                newPrefix.add(ints.get(i));
                newInts.remove(i);

                permute( newPrefix, str.substring(0, i) + str.substring(i+1, n), perms );
            }
        }
}

如果你是效率的坚持者,那么你知道所有列表的最终大小是什么,并且你知道排列列表的最终大小是什么(N!)然后你可以使用数组,并且到目前为止,将整数保存到数组中的位置。但是这个解决方案最容易理解和实现