具有给定前缀和后缀的不同子串的数量

时间:2014-03-29 23:54:00

标签: string algorithm suffix-array

假设我有一个字符串S。

我需要找到S的不同子串的数量,其中包含S1作为前缀,S2作为后缀。

S,S1和S2的范围可能非常大,即O(10 ^ 5)。

例如。

假设S是“abcdcd”,S1是“ab”而S2是“cd”。

“ababcdcd”的明显子串是: “a”,“b”,“c”,“d”,“ab”,“bc”,“cd”,“dc”,“abc”,“bcd”,“cdc”,“dcd”,“abcd” “,”bcdc“,”cdcd“,”abcdc“,”bcdcd“,”abcdcd“。使用后缀数组可以轻松找到总不同子串的数量。我试图扩展同样的想法来解决这个问题。

在这些子串中,包含“ab”作为前缀和“cd”作为后缀的子串是: “abcd”,“abcdcd”。

因此答案是2.

PS:我相信它使用了后缀阵列,但我不确定如何。请帮忙。

1 个答案:

答案 0 :(得分:0)

解决方案很简单:

  • 建立所有前缀出现的列表。
  • 构建后缀所有出现的列表。
  • 计算有效组合。

复杂性:O(#S +#S1)+ O(#S +#S2)+ O(#found(S1)+#found(S2))

可选而不是省略那些数组:

startpos, endpos, startcount, ret = -1, -1, 0, 0
while startpos = find new embedding of S1 after startpos
  while (endpos-startpos)<max(#S1,#S2)
    if not endpos = find new embedding of S2 after endpos
      return ret
    ret = ret + startcount
  startcount = startcount + 1
return ret

复杂性现在应该是O(2 *#S +#S1 +#S2)。但我不确定......