Найти длину самой длинной последовательности, состоящей из символов 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 шт):

Автор решения: Danis
  1. индексы надо писать в квадратные скобки, а не в круглые

  2. for i in s так вы проходитесь по всем элементам, а вам надо все индексы. надо так for i in range(len(s) - 1)

  3. s[i + 1] == "RR" вы берете один элемент а сравнивает с двумя. надо так s[i + 1] == "R"

  4. вы не где не сохраняете и не обнуляите значение 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) 
→ Ссылка
Автор решения: MBo

Пройдём по индексам строки. Встретили 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)

   
→ Ссылка
Автор решения: kram_web

вот мой вариант решения: где 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)))
→ Ссылка
Автор решения: Stanislav Volodarskiy

Напрашивается решение с 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'
    ))
→ Ссылка
Автор решения: Vladimir Bogdanov

Не такое красивое решение как с 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))
→ Ссылка
Автор решения: Fox Fox

Готовый консольный скрипт для тестирования:

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")
→ Ссылка