讓我假定字符串n
的長度至少比期間p
大兩倍。
算法
- 讓
m
= 1,並且S
整個字符串
- 取
m
= M * 2
- 查找子串S的下一個出現[:米]
- 讓
k
成爲下一次出現的開始
- 檢查是否S [:k]爲週期
- 如果不去2.
例
假設我們有一個字符串
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
對於每個功率m
2我們發現第一個2^m
字符的重複。然後我們將這個序列擴展到第二個事件。我們從2^1開始,所以CD
。
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
CDCD CDCD CDCD CDCD CD
我們不會延長CD
,因爲下一次出現就在此之後。然而CD
不是我們正在尋找的子字符串,所以讓我們來看下一個功能:2^2 = 4
和子字符串CDCD
。
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
CDCD CDCD
現在讓我們將字符串擴展到第一個重複。我們得到
CDCDFBF
我們檢查這是否是週期性的。這不是我們走得更遠。我們嘗試2^3 = 8,所以CDCDFBFC
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
CDCDFBFC CDCDFBFC
我們儘量延長,我們得到
CDCDFBFCDCDFDF
,這確實是我們的時間。
我希望這可以在O(n log n)中用一些類似KMP的算法來檢查給定字符串出現的位置。請注意,一些邊緣情況仍應在此處制定。
直覺上這應該可行,但我的直覺已經在這個問題上一次失敗了,所以請糾正我,如果我錯了。我會試着找出一個證明。
雖然是一個非常不錯的問題。
爲什麼S2 substring不是AB? – csmckelvey
對不起AB。錯字。 – Aditya
現在我對S3感到困惑。美國廣播公司不重複,或者這也是一個錯字?抱歉挑剔,我只是想弄清楚你想要輸出什麼。 – csmckelvey