【发布时间】: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 <= A.length(); j++)行应更改为for (int j = i+1; j <= A.length() - i; j++)
标签: java algorithm performance substring time-complexity