【问题标题】:Find all possible substring in fastest way [duplicate]以最快的方式找到所有可能的子字符串[重复]
【发布时间】:2013-03-21 12:51:17
【问题描述】:

对于字符串 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)。我们可以让它更快吗?我提到了上一个问题,并且有suffix tree 的链接,但它似乎并没有解决我的问题。我从后缀树得到的输出是

{
 1: abcd
 2: bcd
 3: cd
 4: d
} 

谁能帮我找到最快的方法来做到这一点?类似于线性时间?

【问题讨论】:

  • 你不可能比 O(n^2) 更快地列出每个可能的子串的起点和终点,因为有 O(n^2) 个这样的子串!如果您想完整地打印出每个子字符串(就像您当前所做的那样),那么时间复杂度会上升到 O(n^3),因为打印每个子字符串所需的时间与整个字符串长度成正比。
  • 另请注意,空字符串也是有效的子字符串。
  • 只有在不“触及”所有子字符串的集合上运行查询时,才能加快速度。打印它们会触及所有这些。如果您想问,“最长出现至少两次的子字符串是什么”或“哪个子字符串出现频率超过 k 个字符”,那么您可以在不枚举所有子字符串的情况下这样做(使用后缀树)。
  • for (int j = i+1; j &lt;= A.length(); j++) 行应更改为 for (int j = i+1; j &lt;= A.length() - i; j++)

标签: java algorithm performance substring time-complexity


【解决方案1】:

您不能在比O(N^2) 更好的时间内创建O(N^2) 字符串。这是数学上的不可能。即使创建一个字符串需要一条指令,那仍然是 O(N^2) 计算。

抛开复杂性不谈,我认为您的代码无法以任何显着的方式改进。


我们可以让它更快吗?

可能不会。

优化这段特定的代码是徒劳的。由于您正在将字符串写入标准输出,因此实际性能将取决于写入字符的开销......以及操作系统对输出所做的任何事情。

【讨论】:

    猜你喜欢
    • 2016-10-05
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多