Тема: Пошук максимального дублювання в тексті
Якось знову помітив статтю вікіпедії яку можна скоротити на пару десятків кілобайт правильним оформленням, замінивши повтори в тексті правильним шаблоном.
І з цього з'явилася задача. Є текст (послідовність символів юнікоду), який може містити повторення. Наприклад:
Ти казала: «В понеділок
Підем разом по барвінок».
Я прийшов, тебе нема,
Підманула-підвела.
Ти ж мене підманула,
Ти ж мене підвела,
Ти ж мене молодого
З ума-розуму звела.
Ти казала у вівторок
Поцілуєш разів сорок,
Я прийшов, тебе нема,
Підманула-підвела.
Ти ж мене підманула,
Ти ж мене підвела,
Ти ж мене молодого
З ума-розуму звела.
Неозброєним оком видно що якщо
# типу python
приспів = """
Ти ж мене підманула,
Ти ж мене підвела,
Ти ж мене молодого
З ума-розуму звела.
"""
то текст можна скоротити до
# все ще python
f"""
Ти казала: «В понеділок
Підем разом по барвінок».
Я прийшов, тебе нема,
Підманула-підвела.
{приспів}
Ти казала у вівторок
Поцілуєш разів сорок,
Я прийшов, тебе нема,
Підманула-підвела.
{приспів}
"""
Як написати функцію, яка для даного тексту, і довжини назви змінної, знаходить якомога довшу порцію тексту що якомога частіше повторюється, так щоб при її заміні змінною цей текст максимально скоротився. Повторююсь, при цьому врахувати те що змінна сама по собі має певну довжину. Я в інтернеті бачив якісь згадки про суфіксні дерева, але поки що не зрозумів як написати такий алгоритм.
Цікаво потім буде його для дампу вікіпедії запустити.