对于字符串A =“abcd” 那么答案应该是{a,ab,abc,abcd,b,bc,bcd,c,cd,d}
查找我使用的所有子字符串
for (int i = 0; i < A.length(); i++) {
for (int j = i+1; j <= A.length(); j++) {
System.out.println(A.substring(i,j));
}
}
但根据我的理解,复杂性是O(N ^ 2)。我们可以加快速度吗?我提到了以前的问题,并且有后缀树http://allisons.org/ll/AlgDS/Tree/Suffix/的链接,但它似乎没有解决我的问题....我从后缀树得到的输出是{1:abcd 2:bcd 3:cd 4:d} 任何人都可以帮助我找到最快的方法吗?像线性时间的东西?
答案 0 :(得分:26)
您无法在O(N^2)
时间内创建O(N^2)
个字符串。这是一种数学上的不可能性。即使创建一个字符串只需要一条指令,这仍然是O(N^2)
计算。
抛开复杂性,我不认为你的代码可以在任何重要方面得到改进。
我应该观察到优化这段代码是徒劳的,因为实际的性能将由将字符写入输出流的开销以及操作系统对输出流所做的任何事情来主导。