有没有一种方法可以在不到O(n)的时间内连接Java字符串?

有没有一种方法可以在不到O(n)的时间内连接Java字符串?,java,string-concatenation,Java,String Concatenation,我的家庭作业问题涉及按特定顺序连接字符串。我们首先得到字符串,然后是一组指令,告诉我们如何连接它们;最后,我们打印输出字符串 我使用了Kattis FastIO类来处理缓冲输入和输出。下面是我的算法,它通过迭代指令来连接字符串。我尝试过制作普通字符串、StringBuffers和StringBuilder的数组 该程序似乎按预期运行,但由于效率低下,在我的提交平台上出现了时间限制错误。它似乎像是附加了我所做的是O(n);有没有更快的办法 public class JoinStrings {

我的家庭作业问题涉及按特定顺序连接字符串。我们首先得到字符串,然后是一组指令,告诉我们如何连接它们;最后,我们打印输出字符串

我使用了Kattis FastIO类来处理缓冲输入和输出。下面是我的算法,它通过迭代指令来连接字符串。我尝试过制作普通字符串、StringBuffers和StringBuilder的数组

该程序似乎按预期运行,但由于效率低下,在我的提交平台上出现了时间限制错误。它似乎像是附加了我所做的是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();
    }
} 
公共类JoinStrings{
公共静态void main(字符串[]args){
Kattio io=新的Kattio(系统输入,系统输出);
ArrayList stringList=新建ArrayList();
int numStrings=io.getInt();
StringBuilder[]stringArray=新的StringBuilder[numString];
对于(int i=0;i
StringBuilder.append()将字符从新字符串复制到现有字符串。它很快,但不是免费的


不要一直将字符串追加到StringBuilder数组,而是跟踪需要追加的字符串索引。然后最后追加存储在打印输出索引列表中的字符串。

stringArray[a-1]。追加(stringArray[b-1])本身是
O(n)
。循环使程序在
O(n^2)
时间内运行。这是因为
append(…)
使用了
System.arraycopy
,这是一种本机方法,其复杂性为
O(n)
。我们需要有关该问题的更多信息。结果的大小可以是指数级的(例如,如果将字符串附加到其自身)。如果您必须输出此结果,您将无能为力(而
StringBuilder
是最有效的解决方案之一)。所以有一些假设你没有告诉我们。是的,我相信最后一点关于跟踪最终concat操作是快速解决这个问题的关键,因为不管怎样,Java中的字符串连接是
O(N)
,其中
N
是两者的大小strings@smac89是 啊因此,我们没有附加字符串,而是只按附加顺序保留索引列表。字符串越长,我们的效率就越高:DHmm,好的。但是,在末尾连接所有N个字符串实际上更快吗?我觉得如果我在字符串集合上迭代只是为了连接它们,它的复杂性将和以前一样?@ryancheng,不要做单独的concat。事实上,不要做concats,因为可能会耗尽内存。如果这是C,我建议使用
putc
立即打印每个字符。在Java中,尝试使用
BufferedOutputStream
执行此操作。不过,我的建议是,在打印之前,避免将内存中的所有字符串都浓缩,因为这样做的工作量是IO系统通过buffer@smac89谢谢,我开发了一个解决方案,包括确定索引的顺序(按照Mạ新罕布什尔州奎伊ế唐古伊ễn的建议),然后使用打印功能将它们简单地打印在一行中。它有缺陷,无法通过私有测试用例,但在不连接方面做得很好。