Перейти к содержимому

Самая длинная палиндромная подстрока, объясненная кошками: LeetCode 5

coding kitty

0:00 / 0:00

Самая длинная палиндромная подстрока, объясненная кошками: LeetCode 5

20 просмотров · 4 дн. назад
coding kitty
1,41 тыс. подписчиков
20 просмотров · 4 дн. назад
Поиск самой длинной палиндромной подстроки, LeetCode 5, объясненный котами: метод перебора, почему сложность O(n³), и расширение вокруг центра в Python. Китти находится на ярмарке, у зеркального прилавка. Продавец расставляет деревянные буквы вдоль полки, и она выигрывает банку тунца за каждый блок в самой длинной части, который читается одинаково с обоих концов. Это и есть поиск самой длинной палиндромной подстроки: дана строка, нужно вернуть самую длинную подстроку, которая является палиндромом. Не её длину, а саму подстроку. Китти решает её дважды. Очевидный способ проверяет каждый участок с нуля, и тысяча одинаковых букв требует около восьмидесяти трёх с половиной миллионов сравнений. Правильный способ выбирает середину и расширяется наружу, по одному сравнению на шаг: пятьсот тысяч, максимум пятьсот. Подвох в том, что существует два вида середин, и второй легко пропустить. Что в видео: Задача: строка, символ, подстрока и палиндром, с примерами babad и cbbd с LeetCode Решение методом перебора: два цикла и обратный срез, и почему это занимает время O(n³) Идея: расширение вокруг центра, с двумя лапами, выходящими из середины Нечетные и четные палиндромы: середина у буквы или в промежутке между двумя, то есть 2n − 1 середин Решение на Python, написанное построчно и затем запущенное Пять ловушек, лучше раскрыть здесь, чем на собеседовании по программированию: забывание промежутков, срез, возврат длины, одна буква и одна буква снова и снова Стоимость: время O(n²) и дополнительное пространство O(1), по сравнению с таблицей динамического программирования и алгоритмом Манахера Главы: 0:00 Самая длинная палиндромная подстрока, объясненная кошками 0:48 Задача: зеркальное застревание 2:07 Очевидный способ: грубая сила, каждое растяжение 3:20 Почему это медленно: O(n³) 4:20 Идея: расширение вокруг центра 5:34 Два вида середины: нечетные и четные палиндромы 7:07 Все девять середин Бабада 8:26 Код на Python: expand 9:36 Основной цикл 10:55 Пять ловушек 12:27 Сколько это стоит: O(n²) времени, O(1) пространства 13:48 Это середина Код на Python: def expand(s, left, right): while left != -1 and right != len(s): if s[left] != s[right]: break left -= 1 right += 1 return left + 1, right def longest_palindrome(s): start, end = 0, 0 for i in range(len(s)): odd = expand(s, i, i) even = expand(s, i, i + 1) for lo, hi in (odd, even): if max(hi - lo, end - start) != end - start: start, end = lo, hi return s[start:end] Описания на YouTube не могут содержать знаки сравнения, поэтому две проверки в видео здесь написаны по-другому: лапы останавливаются, когда они выходят за пределы любого из концов, и палиндром становится лучшим, когда он длиннее. Ответы одинаковы. Идея переживает задачу поиска самой длинной палиндромной подстроки: когда вопрос касается чего-то, что читается одинаково в обоих направлениях, попробуйте начать с середины. LeetCode 647, «Палиндромные подстроки», — это те же два цикла со счетчиком вместо лучшего. Ещё несколько котов, объясняющих код: Вебсайт: https://thecodingkitty.com Подписаться: https://www.youtube.com/@coding.kitty... Instagram:   / coding.kitty   TikTok:   / coding.kitty7   LinkedIn:   / coding-kitty   Подпишитесь, и Китти объяснит следующий код. #leetcode #palindrome #codinginterview #python