Нашли ошибку?

Общий мотив двух мелодий

ЛёгкаяДописатьГлава 9

#динамическое программирование#общая подпоследовательностьid: ga-melody-subsequence

Мелодии записаны строками нот, например "CDEFG". Общий мотив — самая длинная общая подпоследовательность: ноты идут в том же порядке, но не обязательно подряд. Допишите common_motif_length(a, b): функция заполняет таблицу и возвращает длину общего мотива. Пропуски помечены # TODO.

Примеры

common_motif_length("CDEFGAB", "CEGBD")   # 4: C E G B
common_motif_length("AAAA", "AA")         # 2
common_motif_length("CDE", "FGA")         # 0

Решение

def common_motif_length(a: str, b: str) -> int:
    """Длина самой длинной общей подпоследовательности строк a и b."""
    table = [[0] * (len(b) + 1) for _ in range(len(a) + 1)]
    for i in range(1, len(a) + 1):
        for j in range(1, len(b) + 1):
            if a[i - 1] == b[j - 1]:
                # TODO: ноты совпали
                pass
            else:
                # TODO: ноты не совпали
                pass
    return table[len(a)][len(b)]

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 melody_subsequence.py — тесты те же, результат покажет ✓ / ✗ и итог.