簡體   English   中英

找到三個相等長度的相等子串

[英]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]的最大后綴的長度。

然后,我們只需要遍歷整個字符串。 對於每個ii = 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)

因此,對於每個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM