以最快的方式找到所有可能的子字符串[重复]
Posted
技术标签:
【中文标题】以最快的方式找到所有可能的子字符串[重复]【英文标题】: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 <= A.length(); j++)
行应更改为 for (int j = i+1; j <= A.length() - i; j++)
【参考方案1】:
您不能在比O(N^2)
更好的时间内创建O(N^2)
字符串。这是数学上的不可能。即使创建一个字符串需要一条指令,那仍然是 O(N^2)
计算。
抛开复杂性不谈,我认为您的代码无法以任何显着的方式改进。
我们可以让它更快吗?
可能不会。
优化这段特定的代码是徒劳的。由于您正在将字符串写入标准输出,因此实际性能将取决于写入字符的开销......以及操作系统对输出所做的任何事情。
【讨论】:
以上是关于以最快的方式找到所有可能的子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章