【问题标题】:Search all ocurrences of string in array搜索数组中所有出现的字符串
【发布时间】:2017-04-24 12:22:29
【问题描述】:

假设我有一个大小为 n 的字符串数组 A,并且 A按字典顺序排序的,对于示例:

0: abcaoeir
1: acda
2: acdttt
3: acdy
4: degaeiour
5: utsss

给定一个大小为 m 的字符串 S,如何找到第一个索引 i 和最后一个索引 jA 使得:

  • SA[ i ] 的前缀,没有 k 会有 S作为 A[ k ]

  • 的前缀
  • SA[ j ] 的前缀,没有 k > i 会有 S作为 A[ k ]

  • 的前缀

i是第一个索引,S是前缀,j是最后一个。

例如,给定 AS = "acd"

0: abcaoeir
1: acda         [this will be the i]
2: acdttt
3: acdy         [this will be the j]
4: degaeiour
5: utsss

我怎样才能在 O(m + lg(n)) 时间内找到这样的 ij

【问题讨论】:

标签: c++ algorithm string-matching


【解决方案1】:

当数组排序后,您可以使用std::lower_bound来查找序列的开始(即您的 lg(n)),然后线性搜索以找到序列的结尾(即您的 m)。

【讨论】:

  • 这个答案是错误的。 std::lower_bound 将花费接近 m*lg(n) 的时间,因为在最坏的情况下它可以比较接近所有 m 个字符 lg(n) 次,并且线性搜索在最坏的情况下将花费 n(而不是 m),所以这个解决方案是 O(m(lg(n) + n)) = O(m.lg(n) + mn)
  • 您似乎在复杂时间中对字符串本身进行逐字符比较。如果是这种情况,那么基本上,您没有机会以这种方式构造数据。或许如果您将数据重组为 trie?
  • 这是可能的,你只需要使用 LCP-LR 数组在数组中进行二进制搜索,不要重复比较
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多