Дана строка из заглавных латинских букв и точек. Определите максимальное количество идущих подряд символов, среди которых не более четырёх точек

Подскажите как сделать это задание? Не понимаю почему код просто считает символы, подскажите пожалуйста что не правильно и как лучше сделать.

s = input("Введите строку: ")

left = 0
right = len(s)
dots_count = 0
symbol_count = 0
symbol2 = 0
symbol = []

while left != right:
    if s[left] == '.':
        dots_count += 1
    else:
        symbol_count += 1

    if dots_count == 4:
        dots_count = 0
        if s[left] == '.':
            dots_count += 1
        else:
            symbol2 += 1

    left += 1
    symbol.append(max(symbol_count, symbol2))
print(max(symbol))

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

Автор решения: Алексей Свириденко

Если я вас правильно понял то вот решения данной задачи:

import re

text = "d.a..d..da..e.w.ww..."
matches = re.findall(r'\.{1,}', text)
result = len(max(matches))

print(result)

- 3
→ Ссылка
Автор решения: Stanislav Volodarskiy

Ваша программа что-то странное считает:

строка что возвращает программа верный ответ
.a.a.a.a.a. 5 9: .a.a.a.a.a.
.a.a.a.a.. 4 8: .a.a.a.a..
.a.a.a.. 3 7: .a.a.a...

Кажется вы возвращает число букв-не-точек, а надо возвращать длину подстроки с точками. И даже если это исправить, всё равно ваша программа проверяет не все возможные подстроки.

Решение

indices(seq, item) возвращает все индексы значения item в последовательности seq. Она ещё добавляет в начале -1 и в конце индекс за концом последовательности.

interval(seq, k) пускает по последовательности два итератора с интервалом k позиций.

main() вводит строку и перебирает все пары точек с интервалом в пять позиций. Из них выбирается пара с максимальным расстоянием. Если такой пары нет, печатается длина строки.

def indices(seq, item):
    yield -1
    i = -1 # to process empty seq
    for i, v in enumerate(seq):
        if v == item:
            yield i
    yield i + 1


def interval(seq, k):
    it = iter(seq)
    ring = [v for _, v in zip(range(k), it)]
    i = 0
    for v in it:
        yield ring[i], v
        ring[i] = v
        i = (i + 1) % k


def main():
    s = input()
    print(max(
        (b - a - 1 for a, b in interval(indices(s, '.'), 5)),
        default=len(s)
    ))


main()
→ Ссылка
Автор решения: MBo

Ваша программа не двигает right, а этот индекс должен проходить с начала строки:

def max4p(s, nump):
    leng = len(s)
    left = 0
    right = -1
    cnt = 0
    maxlen = 0

    while (right < leng):
        while (right < leng) and (cnt <= nump):
            right += 1
            if right < leng:
                if s[right] == '.':
                    cnt += 1
        maxlen = max(maxlen, right - left)

        while (left < right) and (cnt > nump):
            if s[left] == '.':
                cnt -= 1
            left += 1

    return maxlen

print(max4p('..ab.cd.ef.g', 4))    #11
print(max4p('.....a.b.c.e.', 4))   #8
→ Ссылка