【问题标题】:Is-k-Substring function with a suffix tree带有后缀树的 is-k-Substring 函数
【发布时间】:2017-08-27 09:33:45
【问题描述】:

如何进行下一个操作,以字符串s为后缀树,其顶点数以O(|s|)为界:

Is-k-Sub-string(r) - 检查字符串 r 是否是 s 的 k-sub-string,其中 k-sub-string 定义如下:

如果存在 s 到子字符串的分区,则将 s 的子字符串 r 定义为 k-子字符串:

r=x1x2...xk; xi = s 的子串。

示例:s = whitething,r = inside,r 是 s 的 3 个子串。

我需要该操作以 O(|r|) 的复杂度工作。

我不明白如何在 O(|r|) 上执行此操作,因为 r 中的每个字符都可以是当前分隔符,例如使用 2-Sub-string,因此我必须尝试所有可能的字符作为 x1 和 x2 之间的分隔符(对于分区 r=x1x2)。

有什么想法吗?

【问题讨论】:

    标签: algorithm substring time-complexity complexity-theory suffix-tree


    【解决方案1】:

    引理:如果AB的后缀,B最多可以拆分为kS的子字符串,A也可以。

    证明:让B = x[1] x[2] x[3] ... x[k]。让我们扔掉分区的第一个|B| - |A| 字符。我们将得到一个不超过k 个部分的分区。

    推论:如果我们有某个前缀为R 的固定分区,则存在一个最优分区,其中下一个子字符串是我们可以取的最长的。

    解决方案紧随上面证明的陈述。我们可以尽可能地制作每个部分:

    pos = 0
    while pos < R.length:
          take the longest prefix of R[pos:] that is a substring of R
          move pos after the end of this substring
    

    这个解决方案可以在线性时间内实现:我们可以从树的根开始,只要它们对R的当前字符进行转换,就可以继续进行。如果没有,我们将当前部分添加到答案中并从根目录重新启动。

    【讨论】:

    • 问题要求s中的子串不相交
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2012-06-26
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多