最长的通用前缀查询

时间:2018-04-19 19:12:31

标签: string algorithm data-structures

给出n个字符串。对于由l和r组成的q查询,我应该为序列[l,r]中的所有字符串对输出LCP(最长公共前缀)。是否有任何可以帮助的数据结构(Segment树,Fenwick ......)有了这个?我怎么能预先计算任何东西,记住n和q都是< = 10 ^ 5。所有字符串长度的总和是< = 10 ^ 5?

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

1 个答案:

答案 0 :(得分:0)

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

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。