Можно ли найти самую длинную подстроку, которая является одновременно префиксом и суффиксом (допускается перекрытие), используя только одно регулярное выражение? Например:
aab
является самым длинным из aabaaabaaaaab
:
aab aaabaaaaab
aaba aab aaaaab
aabaaabaaa aab
Другой пример: babab
является самым длинным в babababab
:
babab abab
ba babab ab
baba babab
Я пытался выполнить sh, используя регулярное выражение, предложенное @nhahtdh в регулярному выражению Lookahead не удается найти одинаковые перекрывающиеся совпадения , но не удается найти первый пример.
Я написал код, который работает правильно, но он слишком медленный, поскольку во многих случаях используется text.find
. Причина, по которой мне приходится прибегать ко всем этим дополнительным логам c, заключается в том, что регулярное выражение r'(?=((\w+).*\2.*\2))'
не настроено на поиск только суффиксов и префиксов. Я пытался использовать ^
и $
, но мне не удалось заставить его работать должным образом.
Вот текущая правильная (но медленная) реализация:
from re import findall
text = "xyzxyzxyzxyzxyz"
matches = findall(r'(?=((\w+).*\2.*\2))', text)
s = ""
result = ""
for (s1, s2) in matches:
if text.startswith(s1) and text.endswith(s1) and text.startswith(s2) and text.endswith(s2):
if len(s1) == len(text):
s = s2
elif len(s2) == len(text):
s = s1
else:
s = s1 if len(s1) > len(s2) else s2
mid = text.find(s, 1)
if not (mid == -1 or mid >= len(text) - len(s)):
result = s if len(s) > len(result) else result
print(result) # xyzxyzxyz