给定一个字符串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)解决方案吗?或者如果不是最新的复杂算法可以提出。
答案 0 :(得分:0)
我认为使用前缀函数可以轻松解决此问题。
考虑字符串S[1 .. N]
。首先,让我们计算前缀函数。在此步骤之后,我们有一个数组P[1 .. N]
,其中P[i]
是子串S[1 .. i]
的最大后缀的长度,匹配它的前缀P[i] < i
。
然后我们只需要迭代整个字符串。对于每i
,i = 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)
所需的子字符串。
因此,对于每个i
,i = 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
。