Подсчитать максимальную подстроку одного и того же символа - PullRequest
1 голос
/ 10 апреля 2020

Я хочу написать функцию, в которой он получает строку (и) и одну букву (буквы). функция должна возвращать длину самой длинной подстроки этой буквы. я не знаю, почему написанная мною функция не работает, например: print (count_longest_repetition ('eabbaaaacccaa ddd', 'a') должна возвращать '4'

    def count_longest_repetition(s, c):
        n= len(s)
        lst=[]
        length_charachter=0
        for i in range(n-1):
            if s[i]==c and s[i+1]==c:
                if s[i] in lst:
                    lst.append(s[i])
                    length_charachter= len(lst)
        return length_charachter

Ответы [ 4 ]

0 голосов
/ 10 апреля 2020

Ваша функция не работает, потому что if s[i] in lst: первоначально вернет false и никогда не сможет добавить что-либо в список lst (поэтому оно будет оставаться ложным в течение l oop).

Вы должны изучить регулярные выражения для этого вида обработки / поиска строк:

import re
def count_longest_repetition(s, c):
    return max((0,*map(len,re.findall(f"{re.escape(c)}+",s))))

Если вам не разрешено использовать библиотеки, вы можете вычислять повторения без использования списка, добавляя совпадения к счетчику, который вы используете. сбросить при каждом несоответствии:

def count_longest_repetition(s, c):
    maxCount = count = 0
    for b in s:
        count = (count+1)*(b==c)
        maxCount = max(count,maxCount)
    return maxCount
0 голосов
/ 10 апреля 2020

Я мог бы предложить использовать здесь подход регулярных выражений с re.findall:

def count_longest_repetition(s, c):
    matches = re.findall(r'' + c + '+', s)
    matches = sorted(matches, key=len, reverse=True)
    return len(matches[0])

cnt = count_longest_repetition('eabbaaaacccaaddd', 'a')
print(cnt)

Это печатает: 4

Чтобы лучше объяснить выше, учитывая показанные входные данные, регулярное выражение используется a+, то есть найти группы из одного или нескольких a символов. Результат сортированного списка в результате вызова re.findall:

['aaaa', 'aa', 'a']

Сортируя по убыванию по длине строки, мы получаем sh самое длинное совпадение в начале списка. Затем мы возвращаем эту длину из функции.

0 голосов
/ 10 апреля 2020

Это также можно сделать с помощью groupby

from itertools import groupby
def count_longest_repetition(text,let):
    return max([len(list(group)) for key, group in groupby(list(text)) if key==let])



count_longest_repetition("eabbaaaacccaaddd",'a')

#returns 4
0 голосов
/ 10 апреля 2020

Из-за условия if s[i] in lst ничего не будет добавлено к 'lst', так как изначально 'lst' пусто и условие if никогда не будет выполнено. Также, чтобы пройти через всю строку, вам нужно использовать range(n), поскольку она генерирует числа от 0 до n-1. Это должно работать -

def count_longest_repetition(s, c):
    n= len(s)
    length_charachter=0
    max_length = 0
    for i in range(n):
        if s[i] == c:
            length_charachter += 1
        else:
            length_charachter = 0
        max_length = max(max_length, length_charachter)

    return max_length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...