最短的非共享子串

时间:2018-03-08 13:35:38

标签: string algorithm discrete-mathematics

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

UPD:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  • 在每个将存储它为end_node或的Node中添加一个变量 不。到结束节点,我的意思是在后缀树中没有任何子节点。

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

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

    1. 如果此节点是叶节点(使用第一个变量)。返回一对数字“ fir,  sec“ fir = second变量(存储由其生成的文本编号),而sec =  1。
    2. 如果节点不是叶节点。遍历每个孩子,看看:
      • 如果所有源自同一个孩子的孩子都返回一对数字 “冷杉,秒”。 fir =带有孩子的文本编号,其子对象具有min_length和 sec = min_length
      • 如果任何两个孩子来自不同的文本,则返回数字对 “冷杉,秒”。 fir =带有子代的文本编号,子代具有min_length和sec = min_length + 1