Есть задача. Мы можем делать следующие действия:
1) На вводе дана строка X(мы можем её допечатать)
2) Один раз дописать строку Y
3) Отбросить N символов с начала строки.
На вводе дана строка Z Нужно вывести наименьшее Y, при котором возможно получить Z(если необязательно выполнять действие 2) не вывести ничего). Подскажите идею для решения, заранее спасибо.
Условие: Дано строки X, Z. Найти N, Y, такие что: Z == X[N:] + Y и len(Y) длина минимально возможная. Вывести Y строку, если не пустая.
#!/usr/bin/env python3
import sys
X, Z = input(), input()
if not Z: # empty
sys.exit() # nothing to do
i = -1
while True:
i = X.find(Z[0], i+1)
if i == -1: # not found
N, Y = len(X), Z
break
elif Z.startswith(X[i:]): # found min Y
N, Y = i, Z[len(X) - i:]
break
assert Z == X[N:] + Y
if Y:
print(Y)
Пример: Ввод: X, Z = 'abcdef', 'cdefgh'; результат: Y = 'gh':
i
+------+ Y
X |abcdef| ^
+------+ |
+------++
Z |cdef gh|
+-------+
Это простой квадратичный алгоритм: ищем индекс в X, где началоZ строки является суффиксом X. Наименьший такой индекс приводит к наименьшей Y, так как Y строка — это конец Z строки, которая не поместилась в X. Поэтому, если индекс не найден (-1), то Y = Z (наибольший возможный Y).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей