Поиск самой длинной под строки типа "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))
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— после буквыA2— после буквыB
Важно, что эта функция вернёт 1 в таком примере: AAAAAAAAAAA из-за специфики алгоритма. Но, думаю, добавить простейшую проверку на длину после if curlen > maxlen: не составит труда. Также алгоритм чувствителен к регистру, имейте это ввиду.
Если последовательность не найдена, возвращается 0.