假设我有一个字符串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:我相信它使用了后缀阵列,但我不确定如何。请帮忙。答案 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)。但我不确定......