[英]Finding three equal substrings of equal length
給定字符串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)解決方案可以解決此問題? 或者如果不是,那么可以提出的最佳復雜度算法是什么。
我認為可以使用前綴函數輕松解決此問題。
考慮字符串S[1 .. N]
。 首先,讓我們計算一個前綴函數 。 完成此步驟后,我們得到一個數組P[1 .. N]
,其中P[i]
是與其前綴P[i] < i
匹配的子字符串S[1 .. i]
的最大后綴的長度。
然后,我們只需要遍歷整個字符串。 對於每個i
, i = 2 .. N - 1
我們假定中間字符串在位置i
處結束。
同時, P[i]
是與其前綴匹配的S[1 .. i]
1..i P[i]
的最長后綴,而P[N]
是與其前綴匹配的S[1 .. N]
1..N P[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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.