Дана строка из заглавных латинских букв и точек. Определите максимальное количество идущих подряд символов, среди которых не более четырёх точек
Подскажите как сделать это задание? Не понимаю почему код просто считает символы, подскажите пожалуйста что не правильно и как лучше сделать.
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
Ваша программа что-то странное считает:
строка | что возвращает программа | верный ответ |
---|---|---|
.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()
Ваша программа не двигает 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