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

Общий фрагмент двух логов

СредняяНайти ошибку2 ошибкиГлава 9

#динамическое программирование#общая подстрокаid: ga-log-common-fragment

Две строки логов нужно сравнить: какой самый длинный фрагмент встречается в обеих подряд (самая длинная общая подстрока)? Функция common_fragment_length(a, b) решает это таблицей, но перепутала подстроку с подпоследовательностью. В ней две ошибки — найдите и исправьте их.

Примеры

common_fragment_length("error: disk full", "warning: disk quota")   # 7: ": disk " (с пробелами)
common_fragment_length("abcx", "xabc")                              # 3: "abc"

Решение

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

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