Вы начинаете с максимального перекрытия двух строк, а затем выполняете итерацию, уменьшая перекрытие:
def find_overlap(s1, s2):
for i in range(len(s1)):
test1, test2 = s1[i:], s2[:len(s1) - i]
if test1 == test2:
return test1
s1, s2 = "My name is Bogdan", "Bogdan and I am from Russia"
find_overlap(s1, s2)
# 'Bogdan'
s1, s2 = "mynameisbogdan", "bogdanand"
find_overlap(s1, s2)
# 'bogdan'
Как вы можете видеть, это также работает, если две строки не содержат пробелов.
Это имеет время выполнения O (n), но может быть уменьшено до O (min (n, m)), если вы сначала определите, какая из двух строк короче.
Если вы ожидаете, что строка окажется намногокороче, чем даже самая короткая из двух строк, вы можете сделать это даже O (k), где k - длина строки, которую нужно найти, начиная с минимального перекрытия:
def find_overlap(s1, s2):
for i in range(1, len(s1) + 1):
if i == len(s2):
return None
test1, test2 = s1[-i:], s2[:i]
if test1 == test2:
return test1