Быстрый способ найти самую длинную подстроку, используя только регулярное выражение - PullRequest
0 голосов
/ 19 февраля 2020

Можно ли найти самую длинную подстроку, которая является одновременно префиксом и суффиксом (допускается перекрытие), используя только одно регулярное выражение? Например:

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

1 Ответ

0 голосов
/ 19 февраля 2020
string = "babababab"
substring = ""
for length in range(1, len(string)):
    prefix = string[:length]
    suffix = string[-length:]
    if prefix == suffix and string.find(prefix, 1) != len(string) - length:
        substring = prefix

print(substring)

Дополнительная проверка string.find(prefix, 1) != len(string) - length гарантирует, что строка также появляется строго посередине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...