【问题标题】:Find repeating substring of Length N [closed]查找长度为 N 的重复子串
【发布时间】:2015-03-02 02:41:12
【问题描述】:

我必须制作一个 Java 程序,它可以在给定的字符串中找到长度为 n 的所有重复子字符串。输入的字符串非常长,蛮力方法需要太多时间。

我已经尝试过:
目前,我正在分别查找每个子字符串并使用KMP alogrithm 检查该子字符串的重复。这也太费时间了。

解决这个问题有什么更有效的方法?

【问题讨论】:

  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • 不知道为什么这个问题因为“太宽泛”而被否决——手头有一个具体问题,@Program_Dude 还提供了他尝试过的方法以及失败的原因。
  • @Amit 他做了什么?他要一些代码?所以这是题外话
  • @Eliyahu 这完全是主题。他描述了一个问题,描述了一个解决方案,解释了为什么建议的解决方案失败,并要求提供替代方案。比“如何解析字符串?”更“高级”的问题。完全符合主题。
  • 您必须共享一些代码,因此如果有人可以回答您的问题,可以指导您到代码中的特定点,以增强或更改,否则,任何人都必须解决整个问题才能呈现溶胶。这不是本网站的目的,这就是为什么您的问题被投票too broad

标签: java algorithm substring


【解决方案1】:

1) 您应该考虑使用后缀树数据结构。

Suffix Tree

这个数据结构可以在 O(N * log N) 时间内构建
(我认为即使在 O(N) 时间内使用 Ukkonen 算法)
其中 N 是输入字符串的大小/长度。
然后它可以解决许多(否则)困难
O(M) 时间内的任务,其中 M 是模式的大小/长度。

因此,即使我没有尝试您的特定问题,我也很确定
如果您使用后缀树并巧妙地表述您的问题,那么
问题可以通过使用后缀树来解决(在合理的 O 时间内)。

2) 关于这些(和相关)主题的一本非常好的书是这本:

Algorithms on Strings, Trees and Sequences

除非您受过良好的算法训练,否则它并不容易阅读。
但是好吧,阅读这些东西是获得良好训练的唯一途径;)

3) 我建议你也快速浏览一下这个算法。

Aho-Corasick Algorithm

虽然,我不确定,但是……这个可能有点
与您的特定问题无关。

【讨论】:

  • 这个答案很有用。谢谢。
【解决方案2】:

我将采纳@peter.petrov 的建议并通过解释如何实际使用后缀树来解决问题来增强它:

 1. Create a suffix tree from the string, let it be `T`.
 2. Find all nodes of depth `n` in the tree, let that set of nodes be `S`. This can be done using DFS, for example.
 3. For each node `n` in `S`, do the following:
     3.1. Do a DFS, and count the number of terminals `n` leads to. Let this number be `count`
     3.2. If `count>1`, yield the substring that is related to `n` (the path from root to `n`), and `count`

请注意,该算法处理任何长度为n 的子字符串并将其添加到集合S 中,并从那里通过计算该子字符串导致的终端数来搜索实际上是子字符串的次数。

这意味着问题的复杂性是O(Creation + Traversal) - 意思是,你首先创建树,然后遍历它(很容易看出你不会在步骤 2-3 中多次遍历树中的每个节点)。由于遍历显然比创建树“更快” - 它给您留下了O(Creation),正如@perer.petrov 所指出的,它是O(|S|)O(|S|log|S|),具体取决于您选择的算法。

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2011-08-25
    • 2012-08-07
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多