Текстовый файл 24-215.txt содержит строку из символов A, B, C и цифр 1, 2, 3, всего не более чем 10^6символов. Определите максимальное количество идущих подряд пар символов вида «буква + цифра».
Проблема в вашем коде заключается в том, что он обрабатывает пары символов только с шагом 2. Это значит, что он пропускает случаи, когда пары "буква+цифра" перекрываются.
Пример:
Строка: A1B2C3A1A2
Ваш код обработает пары: A1, C3, A2. Он пропустит пары B2, A1. Правильный ответ в данном случае — 4 (пары A1, B2, C3, A1).
for i in range(len(f) - 1): # Итерируемся по *всем* символам, кроме последнего
pair = f[i:i + 2] # Создаем пару символов
if pair in res:
current_count += 1
else:
max_count = max(max_count, current_count)
current_count = 0
max_count = max(max_count, current_count) # Проверка после последнего символа
print(max_count)
Объяснение изменений:
Цикл for i in range(len(f) - 1):: Теперь цикл проходит по каждому символу строки, кроме последнего. Это позволяет проверять все возможные пары, включая перекрывающиеся.
pair = f[i:i + 2]: Создаем пару символов, начиная с текущего индекса i.
max_count = max(max_count, current_count): Это строка очень важна. После того, как последовательность пар прерывается (встречается неверная пара), мы сравниваем текущее количество (current_count) с максимальным, найденным ранее (max_count), и сохраняем большее из них в max_count.
max_count = max(max_count, current_count) (после цикла): После завершения цикла нужно еще раз проверить max_count и current_count. Это необходимо, так как максимальная последовательность может находиться в конце строки, и тогда условие else внутри цикла не выполнится.
1) Не учитываешь последовательности, начинающиеся с нечётной позиции.
2) Не обрабатываешь последнюю подстроку.
И замечания общего вида:
3) in в массиве - это полный перебор значений массива, долго. Для этого есть множества.
4) Складывать в коллекцию все возможные комбинации - немасштабируемый подход. Если бы были все буквы и все цифры, 260 элементов бы перечислял?
5) Открытый файл кто закрывать будет?
Проще сделать так: m = l = e = 0
with open('24-215.txt', 'r' as f:
s = next(f)
for c in s:
d = c.isdigit()
if e == d:
l += 1
e ^= 1
else:
m = max(l // 2, m)
l = e = 0
m = max(l // 2, m)
print(m)
Встретили букву - считаем чередующиеся буквы и цифры. Целочисленная половина получившейся длины - это кол-во идущих подряд пар. И в конце не забываем закрыть последовательность. Если в конце файла - перевод строки и вообще любые символы, кроме букв и цифр, на результат они не повлияют.
Файл закрывается по выходу из блока with.
s = open('24-215.txt'.read() + '@@' # чтобы не заморачиваться с последней подстрокой
end = len(s) - 1 # чтобы не считать на каждой итерации
begin = 0 # левая граница текущей подстроки
i = 0
m = 0
while i < end:
if s.isalpha() and s[i + 1].isdigit(): # проверяем 2 символа
i += 2 # сдвигаемся на 2 символа вправо
else:
m = max(m, i - begin) # пересчитываем максимум
i += 1 # сдвигаемся на 1 символ вправо
begin = i # сдвигаем левую границу подстроки
print(m // 2)