以最快的方式找到所有可能的子字符串[重复]

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 &lt;= A.length(); j++) 行应更改为 for (int j = i+1; j &lt;= A.length() - i; j++) 【参考方案1】:

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

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


我们可以让它更快吗?

可能不会。

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

【讨论】:

以上是关于以最快的方式找到所有可能的子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

字符串的正则表达式,不以指定的子字符串结尾[重复]

如何找到没有重复字符的最长子字符串?

回文子串解法大全

给定一个字符串,找到最长子串的长度,而不重复字符。

具有联合的子字符串在用户定义的函数中工作方式不同

算法五 递归方式实现暴力破解