Не понимаю как работает код
Условие задачи:
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальную длину цепочки вида XYZXYZXYZ... (составленной из фрагментов XYZ, последний фрагмент может быть неполным).
Пробовал написать код сам, но он не справлялся даже с короткой строкой, поэтому начал искать решения других людей. Нашёл код который верно обрабатывал файл, но если я создавал строку сам, то код работало не корректно. Наткнулся на это решение и оно справляется и с той строкой которую я придумал, и с той строкой, которая находится в файле. Но проблема в том, что я не понимаю как это работает.
- Что делает in в цикле while?
- Почему в условиях из значения длинны что-то вычитается?
Пожалуйста, помогите разобраться
s = "XYZXZZYYZXYZXYZXYZX"
k = 'XYZ'
while k in s:
k += 'XYZ'
l = len (k)
if k in s: print (l-1)
elif k[:l - 2] in s: print (l - 2)
else: print (l - 3)
Ответы (1 шт):
Ниже идет описание работы алгоритма, я не считаю его оптимальным, он практически не демонстирует никаких навыков - это простой брутфорс. На мой взгляд единичный посимвольный проход всей строки был бы куда эффективнее - O(n) и продемонстрировал больше навыков.
s = "XYZXZZYYZXYZXYZXYZX"
k = 'XYZ' # (инициализация)
'''
cтрока k приращивается каждый раз на XYZ
и проверяется находится ли такая подстрока в s
с помощью оператора in
'''
while k in s:
print('i')
k += 'XYZ'
'''
так как в цикле авансом прбавляются
3 cимвола без проверки их наличия (инициализация)
то для того чтобы найти неполные строки
используется вычитание из длины
'''
l = len (k) # получаем длину заведомо болшую
'''
это условие "сработает, если k in s: False – Интик"
потому что XYZ + XYZ не содержится в XYZ
'''
if k in s: print ('a', l-1)
'''
тут мы отнимаем сразу 2 символа
k[:l - 2] эквивалентно k[:-2]
XYZXYZX.. и ищем в s
'''
elif k[:l - 2] in s: print ('b', l - 2)
'''
иначе неглядя отнимаем три символа
XYZXYZ...
'''
else: print ('c',l - 3)
'''
таким образом код работает не правильно
из-за не полноты проверки
s = "XY"
k = 'XYZ'
должно вернуть 2 но возвращает 1
s = "XYZXY"
k = 'XYZ'
должно вернуть 5 но возвращает 4
s = "XYZXYZXY"
k = 'XYZ'
должно вернуть 8 но возвращает 7
'''