これが可能なアプローチです(サイクルが隣接している必要があるという事実により、より簡単になります)。文字列を選択します。繰り返されるかどうかを確認します。最も繰り返されるものを追跡します。
実際にテストされた Python コードを編集します。
testStrings =[ "prefixgarbagecyclecyclecyclecyclesufixgarbage",
"prefixgarbagecyclepadinggarbagecyclesufixgarbage",
"prefixgarbagecyclecyclepadinggarbageprefixgarbage",
"prefixgarbagecyclecyclecycleroundroundroundprefixgarbage",
"abcdefghijklmnopqrstuvqxyz"];
for input in testStrings:
repCountMax = 0
longestCycle = ""
repCount = 0
for i in range (1, len(input)):
for j in range( i+1, len(input)):
substring = input[i:j]
#print substring
ls = len(substring)
repCount = 1
k = j
while(substring == input[k:k+ls]):
k = k + ls
repCount = repCount +1
#print "repetition ", repCount, " of ", substring, "\n"
if (repCount > repCountMax) or ((repCount == repCountMax) and len(substring) > len(bestCycle)):
repCountMax = repCount
bestCycle = substring
if repCountMax > 1:
print "best cycle in '", input, "' is '", bestCycle,"' which is repeated ", repCountMax, " times."
else:
print "no repeated cycles found in string ", input
結果の出力:
'prefixgarbagecyclecyclecyclecyclesufixgarbage' の最適なサイクルは、4 回繰り返される 'ecycl' です。
'prefixgarbagecyclepadinggarbagecyclesufixgarbage' の最適なサイクルは 'g' で、2 回繰り返されます。
'prefixgarbagecyclecyclepadinggarbageprefixgarbage' の最適なサイクルは、2 回繰り返される 'ecycl' です。
'prefixgarbagecyclecyclecycleroundroundroundprefixgarbage' の最適なサイクルは、3 回繰り返される 'ecycl' です。
文字列 abcdefghijklmnopqrstuvqxyz に繰り返されるサイクルが見つかりません
注 - 見つかったサイクルはecycl
ではなく でしcycle
た。ecycl
最初に発生した...
2 番目の注意 - 現在の最良の見積もりを「打ち負かす」ことができなくなったときに停止することで、物事をわずかに効率的にすることができます。 6回の繰り返しのためのtスペース。これにより、かなりの数の繰り返しがある場合に速度が向上します。それを実装する方法については、エフゲニーのソリューションを参照してください。