【发布时间】:2013-12-12 13:17:02
【问题描述】:
在下面的代码中,我找到了给定输入字符串的所有可能排列并将它们存储在一个列表中,然后计算其中的回文数。当输入字符串长度小于 10 时,这工作正常。但是当输入字符串长度大于 10 需要很长时间才能找到排列。我想知道这里可以优化什么以获得恒定的执行时间?
private static char[] inputArray;
private static List<String> listOfpermutations = new ArrayList<>();
private static int count;
public static void main(String s[]) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.readLine();
inputArray = input.toCharArray();
permutation(0);
for (String combination : listOfpermutations) {
if (combination.equals(new StringBuilder(combination).reverse().toString())) {
count++;
}
}
System.out.println(count);
}
public static void permutation(int start)
{
String temp = "";
if (start != 0) {
if (start == inputArray.length) {
for (int i = 0; i < start; i++) {
temp = temp + inputArray[i];
}
if (!listOfpermutations.contains(temp)) {
listOfpermutations.add(temp);
}
}
}
for (int i = start; i < inputArray.length; i++)
{
swap(start, i);
permutation(start + 1);
swap(start, i);
}
}
static void swap(int pos1, int pos2) {
char temp = inputArray[pos1];
inputArray[pos1] = inputArray[pos2];
inputArray[pos2] = temp;
}
测试输入:
- aaabbb //效果很好
- ccccddddcc //工作正常
- ccccdddddcce //这里的时间太长了
【问题讨论】:
-
你同时使用循环和递归......你应该尽量避免......
-
很确定恒定时间是不可能的。
-
不可能持续执行,因为你试图生成 n!排列。执行时间总是随着 n 增长。
-
@DanglingPiyush - 使用不同的数据结构只会改变常量值......它可能会有所帮助,但不会产生重大影响......
标签: java algorithm optimization permutation