Поиск самой длинной под строки типа "ABA"

Дан файл с буквами латинского алфавита, необходимо определить длину самой большой последовательности из AB оканчивающуюся на A.

Мое решение не подходит:

with open('zadanie24_1.txt') as f:
    s = f.read()
    c = 0
    m = 0
    for i in range(0,len(s)-1):
        if (s[i] == 'A') and (s[i+1] == 'B'):
            c+=2
            if c>m:
                m = c
            continue
        elif s[i] == 'A':
            c+=1
            if c>m: 
                m = c
                c = 0

            continue


        
print(m)

UPD

Я добавил проверку на индекс, чтобы можно было получать только строки, которые начинаются и заканчиваются A, но это все еще не работает правильно

with open('zadanie24_1.txt') as f:
    s = f.read()

m = 0
c = 0

for i in range(0,len(s)):
    if (s[i] == 'A' and c%2 ==0) or (s[i] == 'B' and c%2 != 0):
        c+=1
        if c>m:
            m = c
            c = 0



print(m)

Как решить задачу правильно и почему моя программа выдает неправильный ответ?


Ответы (2 шт):

Автор решения: Кирилл Малышев
import re

pattern = r'(?:AB)+A'
s = 'qqqqABqqqqqqABAqqqqqqABABABABAqqq'
print(max(re.findall(pattern, s), key=len))

https://ideone.com/hdyRSO

→ Ссылка
Автор решения: return
def find_longest_seq(str):
    state = 0
    maxlen = 0
    curlen = 0

    for i in range(0, len(str)):
        curchr = str[i]

        match state:
            case 0:
                if (curchr == 'A'):
                    curlen += 1
                    state = 1
            case 1:
                if (curchr == 'B'):
                    curlen += 1
                    state = 2
                else:
                    if curlen > maxlen:
                        maxlen = curlen

                    curlen = 0
                    state = 0
            case 2:
                if (curchr == 'A'):
                    curlen += 1
                    state = 1
                else:
                    curlen = 0
                    state = 0

    return maxlen

В пайтоне я не спец, так что не судите строго. Переменная state содержит состояние парсера:

  • 0 — мы вне последовательности
  • 1 — после буквы A
  • 2 — после буквы B

Важно, что эта функция вернёт 1 в таком примере: AAAAAAAAAAA из-за специфики алгоритма. Но, думаю, добавить простейшую проверку на длину после if curlen > maxlen: не составит труда. Также алгоритм чувствителен к регистру, имейте это ввиду.

Если последовательность не найдена, возвращается 0.

→ Ссылка