【发布时间】:2018-09-30 09:34:19
【问题描述】:
给定 n 个字符串。对于由 l 和 r 组成的 q 个查询,我应该为序列 [l, r] 中的所有字符串对输出 LCP(最长公共前缀)。是否有任何数据结构(段树,Fenwick ...)可以提供帮助有了这个?记住n和q都是
除了蛮力解决方案我没有其他想法......
【问题讨论】:
标签: string algorithm data-structures
给定 n 个字符串。对于由 l 和 r 组成的 q 个查询,我应该为序列 [l, r] 中的所有字符串对输出 LCP(最长公共前缀)。是否有任何数据结构(段树,Fenwick ...)可以提供帮助有了这个?记住n和q都是
除了蛮力解决方案我没有其他想法......
【问题讨论】:
标签: string algorithm data-structures
假设给你一些字符串。首先,您需要对它们进行排序。
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。最小和最大索引是1 和9。所以broad和wi-fi在查询中,LCP是空字符串。
例如。 2
l,r = 6,8
排序后的数组中对应的索引是5 6 8。最小和最大索引是5 和8。所以词siam和sit在查询中,LCP是si。
对所有字符串进行排序。要正确估计此处的复杂性,您需要正确建模可能的输入。
对于每个查询,您需要对最大和最小索引进行线性时间搜索,然后找到两个字符串的 LCP。
【讨论】: