Zacznijmy od końca, policz częstotliwość i zatrzymaj się, gdy tylko najczęstszy element pojawi się 3 lub więcej razy.
from collections import Counter
a='fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld'
times=3
for n in range(1,len(a)/times+1)[::-1]:
substrings=[a[i:i+n] for i in range(len(a)-n+1)]
freqs=Counter(substrings)
if freqs.most_common(1)[0][1]>=3:
seq=freqs.most_common(1)[0][0]
break
print "sequence '%s' of length %s occurs %s or more times"%(seq,n,times)
Wynik:
>>> sequence 'helloworld' of length 10 occurs 3 or more times
Edit: jeśli masz wrażenie, że masz do czynienia z losowym wejście i wspólny podciąg powinien mieć małą długością, lepiej zacząć (jeśli trzeba prędkość) z małych podciągów i zatrzymać, gdy nie można znaleźć żadnego, które pojawiają się co najmniej 3 czas:
from collections import Counter
a='fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld'
times=3
for n in range(1,len(a)/times+1):
substrings=[a[i:i+n] for i in range(len(a)-n+1)]
freqs=Counter(substrings)
if freqs.most_common(1)[0][1]<3:
n-=1
break
else:
seq=freqs.most_common(1)[0][0]
print "sequence '%s' of length %s occurs %s or more times"%(seq,n,times)
Taki sam wynik jak wyżej.
Nie wiem, czy istnieje rozwiązanie tego problemu. To nie może być wyrażeniem regularnym, ale python może mieć nieregularne rozszerzenie, które robi coś takiego. W ogólnym przypadku jest to problem LCS, który można rozwiązać za pomocą programowania dynamicznego: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem –