Решение вопроса о кодировании палиндромной подстроки на leetcode. В этом вопросе нас просят найти самую длинную палиндромную подстроку в заданной строке s
.
Строка называется строкой-палиндромом, если обратная сторона этой строки совпадает с исходной строкой.
Решение: выполнить один цикл, найти палиндромы нечетной длины, найти палиндромы четной длины и сохранить самый длинный палиндром.
В этом решении мы пройдемся по строке один раз и дважды вызовем функцию, чтобы найти палиндромы четной и нечетной длины и сохранить самый длинный.
Важно отметить, что палиндромы отражают их центр.
Мы хотим начать с постепенного размещения указателя и проверки совпадения левого и правого значений указателя. Если это так, мы посчитаем его палиндромом и увеличим счетчик, чтобы проверить следующий набор значений слева left — count
и справа right + count
. Например, если мы находим один палиндром, мы увеличиваем счетчик на 1. Затем мы проверяем следующий набор значений слева и справа от указателя, чтобы убедиться, что они также равны. Если значения не совпадают, мы уменьшаем счетчик и возвращаем подстроку с максимальным количеством.
Для палиндрома нечетной длины мы установим центр на i, i
, а для палиндрома четной длины мы установим центр на i, i+1
Нам нужно отслеживать самую длинную палиндромную подстроку по мере прохождения строки и обновлять longest
всякий раз, когда мы находим большую палиндромную подстроку.
Давайте посмотрим на код:
Пример 1:
Input: s = "babad" Output: "bab" Explanation: "aba" is also a valid answer.
Пример 2:
Input: s = "cbbd" Output: "bb" Explanation: we can find one even length palindrome "bb"
Сложность времени и пространства:
Это решение имеет временную сложность O(n ^ 2) и пространственную сложность O(1). В худшем случае, например, если вся строка является палиндромом, пространственная сложность будет O(n).