【问题标题】:Longest Common Prefix Query最长公共前缀查询
【发布时间】:2018-09-30 09:34:19
【问题描述】:

给定 n 个字符串。对于由 l 和 r 组成的 q 个查询,我应该为序列 [l, r] 中的所有字符串对输出 LCP(最长公共前缀)。是否有任何数据结构(段树,Fenwick ...)可以提供帮助有了这个?记住n和q都是

除了蛮力解决方案我没有其他想法......

【问题讨论】:

    标签: string algorithm data-structures


    【解决方案1】:

    假设给你一些字符串。首先,您需要对它们进行排序。

    1. hello    |  1. broad
    2. wi-fi    |  2. brother
    3. brother  |  3. hell
    4. sister   |  4. hello
    5. broad    |  5. siam
    6. siam     |  6. sial
    7. sial     |  7. sister
    8. sit      |  8. sit
    9. hell     |  9. wi-fi
    

    然后创建一个带有索引的数组,以了解每个字符串在排序数组中的位置。

    index in orignal - 1 2 3 4 5 6 7 8 9
    index in sorted  - 4 9 2 7 1 5 6 8 3
    

    现在对于每个查询,您都需要在排序后的数组中找到最小和最大索引。并根据这两个指标找到 LCP。查看示例。

    例如。 1

    l,r = 1,5
    

    排序后的数组中对应的索引是4 9 2 7 1。最小和最大索引是19。所以broadwi-fi在查询中,LCP是空字符串。

    例如。 2

    l,r = 6,8
    

    排序后的数组中对应的索引是5 6 8。最小和最大索引是58。所以词siamsit在查询中,LCP是si

    复杂性

    1. 对所有字符串进行排序。要正确估计此处的复杂性,您需要正确建模可能的输入。

    2. 对于每个查询,您需要对最大和最小索引进行线性时间搜索,然后找到两个字符串的 LCP。

    【讨论】:

    • 好主意!但是,对于查询 1、5,所有对的最大 LCP 是 bro (broad, brother)...
    • @DeanAmbrose 呵呵,我错过了关于对的部分,可能你可以对排序后的数组中的索引进行排序,然后检查每个相邻的对。这不是很快。我会尝试设计一个更好的解决方案。
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2013-04-14
    • 2012-02-01
    • 2020-07-05
    • 2020-02-10
    • 2022-01-11
    相关资源
    最近更新 更多