找到三个相等长度的相等子串

时间:2016-01-31 13:46:39

标签: algorithm

给定一个字符串S,我需要找到三个相等长度的相等子串。 三个字符串中的每一个都不应重叠。此外,如果三个字符串是A,B,C,那么S可能不是A + B + C.只有要保持的条件是A需要是前缀,B需要介于两者之间,C需要是后缀。

每个字符串的最大长度是多少。

示例:让字符串S =“aaaaaa”然后这里的答案是2.如何解决这个问题,请帮忙。 说明:前缀侧为aa {1,2}。后缀侧将是aa {6,7},而部分之间将是aa {3,4}或aa {4,5}。

这个问题可能有O(N)解决方案吗?或者如果不是最新的复杂算法可以提出。

1 个答案:

答案 0 :(得分:0)

我认为使用前缀函数可以轻松解决此问题。

考虑字符串S[1 .. N]。首先,让我们计算前缀函数。在此步骤之后,我们有一个数组P[1 .. N],其中P[i]是子串S[1 .. i]的最大后缀的长度,匹配它的前缀P[i] < i

然后我们只需要迭代整个字符串。对于每ii = 2 .. N - 1,我们假设中间字符串在i位置结束。

同一时间P[i]S[1 .. i]的最长后缀,与其前缀相匹配,P[N]S[1 .. N]的最长后缀,与其前缀匹配。

另请注意,我们的子串不能重叠。因此,对于S[1 .. i],匹配前缀的最长后缀的长度可以是min(P[i], i / 2)所需的子字符串。对于S[1 .. N],匹配前缀的最长后缀的长度可以是min(P[N], N - i)所需的子字符串。

因此,对于每个ii = 2 .. N - 1,我们都可以min(min(P[i], i / 2), min(P[N], N - i))尝试获取最大值来更新答案。

此解决方案具有所需的线性复杂度。

例如,如果检查字符串为"aaaaaa",则P[0, 1, 2, 3, 4, 5]

之后我们尝试更新答案:

i = 2    min(min(1, 2 / 2), min(5, 6 - 2)) = 1
i = 3    min(min(2, 3 / 2), min(5, 6 - 3)) = 1
i = 4    min(min(3, 4 / 2), min(5, 6 - 4)) = 2
i = 5    min(min(4, 5 / 2), min(5, 6 - 5)) = 1

所以答案是2