【发布时间】:2019-09-16 04:07:11
【问题描述】:
我的作业问题涉及以特定顺序连接字符串。我们首先得到字符串,然后是一组指令,告诉我们如何连接它们;最后我们打印输出字符串。
我使用 Kattis FastIO 类来处理缓冲输入和输出。下面是我的算法,它遍历指令以连接字符串。我尝试过制作普通字符串、StringBuffers 和 StringBuilders 的数组。
该程序似乎按预期工作,但由于效率低下,它在我的提交平台上给出了时间限制错误。似乎附加我的方式是 O(n);有没有更快的方法?
public class JoinStrings {
public static void main(String[] args) {
Kattio io = new Kattio(System.in, System.out);
ArrayList<StringBuilder> stringList = new ArrayList<StringBuilder>();
int numStrings = io.getInt();
StringBuilder[] stringArray = new StringBuilder[numStrings];
for (int i = 0; i < numStrings; i++) {
String str = io.getWord();
stringArray[i] = new StringBuilder(str);
}
StringBuilder toPrint = stringArray[0];
while (io.hasMoreTokens()) {
int a = io.getInt();
int b = io.getInt();
stringArray[a-1].append(stringArray[b-1]); // this is the line that is done N times
toPrint = stringArray[a-1];
}
io.println(toPrint.toString());
io.flush();
}
}
【问题讨论】:
-
stringArray[a-1].append(stringArray[b-1]);本身就是O(n)。该循环使您的程序在O(n^2)时间运行。这是因为append(...)使用了System.arraycopy,这是一种复杂度为O(n)的本机方法。 -
我们需要有关该问题的更多信息。结果可以是指数大小(例如,如果您将字符串附加到自身)。如果您必须输出此结果,则您无能为力(
StringBuilder是最有效的解决方案之一)。所以有些假设你没有告诉我们。