【问题标题】:Shortest Non-Shared Substring最短非共享子串
【发布时间】:2018-08-16 21:12:20
【问题描述】:

我们需要找到text_1 中没有出现在text_2 中的最短子串。如何在O(|text_1|+|text_2|)时间使用后缀和LCP数组解决这个问题?

UPD:

我知道如何使用后缀树来解决它。问题是如何单独使用Suffix arrayLCP array 解决问题(没有其他辅助数据结构)。

首先我们需要建立字符串text_1$text_2#的广义后缀数组和lcp数组。然后我们必须对 LCP 数组进行线性扫描,找到 text_1 唯一的最短子串的起始位置和长度。

问题是在 LCP 阵列的线性扫描期间我们需要做什么,以确定唯一替代的起始位置(使用后缀阵列)和长度(使用 LCP 阵列)。

【问题讨论】:

    标签: string algorithm discrete-mathematics


    【解决方案1】:

    我将尝试解释如何通过我开发的方法解决此问题。

    • 在每个节点中添加一个变量来存储它是 end_node 或 不是。结束节点是指在后缀树中它没有任何子节点。

    • 添加一个变量来存储由 text1 或 text2 生成的变量。为了这, 您可以使用您用于迭代的变量的值 text_1$text_2# 在树的创建过程中。

    • 现在方法很简单,假设你在某个节点。

      1. 如果此节点是叶节点(使用第一个变量)。返回一对数字“冷杉, sec" fir=第二个变量(它存储它的文本编号)和 sec= 1.
      2. 如果节点不是叶节点。迭代它的每一个孩子,看看:
        • 如果所有来自同一个孩子的返回对数 “冷杉,秒”。 fir=带有 min_length 的孩子的文本编号和 sec=min_length
        • 如果任何两个孩子来自不同的文本,则返回一对数字 “冷杉,秒”。 fir=带有 min_length 和 sec=min_length+1 的孩子的文本编号

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      相关资源
      最近更新 更多