【问题标题】:Longest Repeated Substring Issue最长重复子串问题
【发布时间】:2012-06-07 22:57:28
【问题描述】:

在创建字符串“ABAB”的后缀树时,我只得到 2 个节点:

ABAB 和 BAB

最长的重复子串(“AB”)应该位于“具有至少 k 个后代的最深节点”,但我的字符串不是这种情况,这里有什么问题?

谢谢

【问题讨论】:

  • 这不是一个正确的后缀树(例如,它在任何地方都没有后缀“B”)。
  • 然而它有,它有“ABAB”和“BAB”的任何后缀(它使用路径压缩)
  • 不,它没有。如果您认为是,请显示实际的后缀树,以及在其上找到后缀“B”的位置。
  • 后缀 B 包含在 BAB 叶中,您可以使用 Mark Nelson 的程序 (marknelson.us/1996/08/01/suffix-trees) 自己运行它我认为我的问题的答案是我需要计算每个字母的出现次数.
  • 我不明白您如何从该表示中提取所有后缀(根据您的推理,您也可以说“ABA”包含在“ABAB”叶中,但 ABA 不是后缀) .我的回答显示了该算法可能预期的表示。

标签: algorithm suffix-tree


【解决方案1】:

如果您使用某种形式的后缀树,它只有两个节点用于字符串 ABAB,那么它不会直接与您引用的算法一起使用。这就是后缀树的样子,O 代表节点,$ 用来标记字符串的结尾。

         O
        / \
       /   \
      B     AB
     /       \
    O         O
   / \       / \
  $  AB$    $  AB$
 /     \   /     \
O       O O       O

这里的关键特性(您正在使用的树中缺少的特性)是每个叶节点对应于字符串的一个后缀。

具有至少两个叶后代的最深节点位于路径 AB 处(深度是从根到达该节点所需的子串长度,在本例中为 2),这确实是最长的重复子串。

【讨论】:

  • 您可以编译并运行 Mark 的示例 (C++) 或仅使用在线后缀树 (allisons.org/ll/AlgDS/Tree/Suffix) 仍然会得到 ABAB 和 BAB
  • @kukit:你的意思是什么?这仍然会给出一个无用的树(对于这个算法),因为它实际上并不代表后缀。如果你明确地添加一个字符串结束标记(即在“ABAB$”上运行你的算法)你应该得到一个正确的树。
  • 感谢您澄清“深度”。我之前将它解释为只是边数,而忽略了字符串的长度。
猜你喜欢
  • 2014-03-22
  • 2017-06-20
  • 2016-11-17
  • 2020-12-25
  • 2012-10-29
  • 2023-03-17
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
相关资源
最近更新 更多