Найти длину самой длинной последовательности, состоящей из символов R
Текстовый файл состоит не более чем из 10^6 символов L, D и R. Определите длину самой длинной последовательности, состоящей из символов R.
Сразу скажу, я в пайтоне новичок, поэтому всё, что смог написать так это:
f = open("zadanie24_2.txt")
s = f.readlines()
m = 0
for i in s:
if s(i) == "R" and s(i + 1) == "RR":
m+=1
print(m)
Где-то в инете нашёл этот код, в него подставлял свои значения, но опять же ничего не вышло
# откроем файл на чтение
F = open ('zadanie24_2.txt', 'rt')
# T - список файла F
T = F.read ().split ()
K = 1 # K - число одинаковых чисел
A = [] # список длин цепочек одинаковых чисел
for i in range (0, len (T) - 1) :
#print (T [i], end = '')
if T [i] == T [i + 1] :
K += 1
else :
A += [K]
K = 1
A += [K]
F.close ()
R = open ('result.txt', 'wt')
R.write (str (max (A)))
R.close ()
print ('Файл result.txt записан')
Помогите, кто может
Ответы (8 шт):
индексы надо писать в квадратные скобки, а не в круглые
for i in sтак вы проходитесь по всем элементам, а вам надо все индексы. надо такfor i in range(len(s) - 1)s[i + 1] == "RR"вы берете один элемент а сравнивает с двумя. надо такs[i + 1] == "R"вы не где не сохраняете и не обнуляите значение
m
f = open("zadanie24_2.txt")
s = f.read()
m = 1
maxlen = 0
for i in range(len(s) - 1):
if s[i] == "R" and s[i + 1] == "R":
m += 1
if mexlen < m:
maxlen = m
else:
m = 1
if maxlen == 0 and "R" in s:
maxlen = 1
print(maxlen)
Пройдём по индексам строки. Встретили R - запомнили индекс начала. Встретили не R - вычислили длину серии.
r = False
maxlen = 0
for i in range(len(s)+1):
if i<len(s) and s[i] == "R":
if not r:
start = i
r = True
else:
if r:
maxlen = max(maxlen, i - start)
r = False
print(maxlen)
вот мой вариант решения: где curLen - временное хранение длины последовательности, maxLen - максимальная длина последовательности, s - строка для работы с символами из файла, i - переменная для перебора всех символов.
f = open("zadanie24.txt")
maxLen = 1
curLen = 1
s = f.readline()
for i in range(2, len(s)):
if s[i] == s[i-1] and s[i]== 'R':
curLen = curLen+1
if curLen > maxLen:
maxLen = curLen
else:
curLen=1
print(maxLen)
Вот вариант в одну строку - на основании строки s создаем список с счетчиками искомого символа, далее берем максимальное значение счетчика (нулевой символ добавляем к строке, чтобы избежать ошибок с пустой строкой):
i = 0
maxLen = max((i := i + 1) if ch == 'R' else (i := 0) for ch in st + [0])
f = open("zadanie24_2.txt").read()
f = f.replace("L", " ").replace("D", " ").split()
f.sort()
print(len(max(f)))
Напрашивается решение с itertools.groupby:
import itertools
with open('zadanie24_2.txt') as f:
print(max(
sum(1 for _ in g)
for k, g in itertools.groupby(f.read())
if k == 'R'
))
Его можно переделать под константную память:
import itertools
def chars(f):
while c := f.read(1):
yield c
with open('zadanie24_2.txt') as f:
print(max(
sum(1 for _ in g)
for k, g in itertools.groupby(chars(f))
if k == 'R'
))
Не такое красивое решение как с itertools.groupby, но без создания каких-либо списков, чисто на итерации и индексах:
data='AAAAANNNKKKAAAAALLLAAAA'
max_len=0
start_idx=None
what_look = 'A'
for idx,val in enumerate(data):
match (val==what_look, start_idx is None):
case (True, True):
start_idx = idx
case (False, False):
max_len=max(max_len,idx-start_idx)
start_idx = None
print(max_len if start_idx is None else max(max_len,idx-start_idx+1))
Готовый консольный скрипт для тестирования:
import os
import re
print("-" * 50 + "\nДлина самой длинной последовательности, состоящей из R:\n" + "-" * 50)
v_string = "LDRRRDRRRRDRRLDDRRRDDDDDDLLLRRRLRRRRLLLLLLLLLLLLLLLRRRRRDDDDDDDDD"
print("\nСтрока:", v_string)
print("Результат:", len(max(re.findall(r'R+', v_string), key=len)))
print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")
