Самая длинная палиндромная подпоследовательность с использованием динамического программирования

Google Translate Icon

Проблема самой длинной палиндромной подпоследовательности (LPS) заключается в поиске самой длинной подпоследовательности строки, которая также является палиндромом.

Задача отличается от задачи поиска самая длинная палиндромная подстрока. В отличие от подстрок, подпоследовательности не обязаны занимать последовательные позиции в исходной строке.

 
Например, рассмотрим последовательность ABBDCACB.

The length of the longest palindromic subsequence is 5
The longest palindromic subsequence is BCACB

Потренируйтесь в этой проблеме

Идея состоит в том, чтобы использовать рекурсия Для решения этой проблемы. Идея состоит в том, чтобы сравнить последний символ строки X[i…j] со своим первым символом. Есть две возможности:

  1. Если последний символ строки совпадает с первым символом, включить первый и последний символы в палиндром и повторить для оставшейся подстроки. X[i+1, j-1].
  2. Если последний символ строки отличается от первого символа, вернуть максимальное из двух значений, которые мы получаем
    • Удаление последнего символа и рекурсия для оставшейся подстроки X[i, j-1].
    • Удаление первого символа и рекурсия для оставшейся подстроки X[i+1, j].

Это дает следующее рекурсивное отношение к нахождению длины самой длинной повторяющейся подпоследовательности последовательности X:

           | 1                                 (if i = j)
LPS[i…j] = | LPS[i+1…j-1] + 2                  (if X[i] = X[j])
           | max (LPS[i+1…j], LPS[i…j-1])      (if X[i] != X[j])

Алгоритм может быть реализован следующим образом на C++, Java и Python. Решение находит длину самой длинной повторяющейся подпоследовательности последовательности X рекурсивно используя приведенные выше соотношения.

C++


Скачать  Выполнить код

результат:

The length of the longest palindromic subsequence is 5

Java


Скачать  Выполнить код

результат:

The length of the longest palindromic subsequence is 5

Python


Скачать  Выполнить код

результат:

The length of the longest palindromic subsequence is 5

Временная сложность приведенного выше решения в наихудшем случае экспоненциальна. O(2n), куда n длина входной строки. Наихудший случай возникает, когда в строке нет повторяющегося символа. X (т. е. длина LPS равна 1), и каждый рекурсивный вызов завершается двумя рекурсивными вызовами. Это также требует дополнительного места для стека вызовов.
 

 
Проблема LPS имеет оптимальное основание а также экспонаты перекрывающиеся подзадачи. Давайте рассмотрим дерево рекурсии для последовательности длины 6, имеющей все различные символы, скажем ABCDEF, длина LPS которого равна 1.

 
Longest Palindromic subsequence

 
Как мы видим, одни и те же подзадачи (выделенные одним цветом) вычисляются неоднократно. Мы знаем, что задачи с оптимальной структурой и перекрывающимися подзадачами могут быть решены с помощью динамического программирования, где решения подзадач памяткаизмерено, а не вычислено, и снова. Этот метод демонстрируется ниже на C++, Java и Python:

C++


Скачать  Выполнить код

результат:

The length of the longest palindromic subsequence is 5

Java


Скачать  Выполнить код

результат:

The length of the longest palindromic subsequence is 5

Python


Скачать  Выполнить код

результат:

The length of the longest palindromic subsequence is 5

Временная сложность приведенного выше решения равна O(n2) и требует O(n2) дополнительное пространство, где n длина входной строки.

 
Однако оба обсуждавшихся выше метода находят только самую длинную длину палиндромной подпоследовательности, но не печатают самую длинную палиндромную подпоследовательность.

Как мы можем напечатать самую длинную палиндромную подпоследовательность?

Задача о самой длинной палиндромной последовательности — классический вариант задачи. Самая длинная общая подпоследовательность (LCS) проблема. Идея состоит в том, чтобы найти ЛВП данной строки с ее реверсом, т. е. вызвать LCS(X, reverse(X)) и самая длинная общая подпоследовательность будет самой длинной палиндромной подпоследовательностью.

Ниже приведена программа на C++, Java и Python, которая демонстрирует это:

C++


Скачать  Выполнить код

Java


Скачать  Выполнить код

Python


Скачать  Выполнить код

Output:
 
The length of the longest palindromic subsequence is 5
The longest palindromic subsequence is BCACB

Временная сложность приведенного выше решения равна O(n2) и требует O(n2) дополнительное пространство, где n длина входной строки.

 
Упражнение: Напишите восходящее решение для приведенной выше рекурсивной нисходящей версии.

Оценить этот пост

Средний рейтинг 4.89/5. Подсчет голосов: 261

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?




Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования :)



Подписывайся
Уведомить о
guest
34 Комментарии
Большинство голосов
Новейшие Самый старый
Встроенные отзывы
Просмотреть все комментарии
НЕ переходите по этой ссылке, иначе вы будете забанены на сайте!