我有一个整数数组,需要使用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 );
}
}
}
答案 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!)然后你可以使用数组,并且到目前为止,将整数保存到数组中的位置。但是这个解决方案最容易理解和实现