Это можно решить в O (n ^ 2) с помощью динамического программирования.По сути, проблема заключается в построении самой длинной палиндромной подпоследовательности в x[i...j]
с использованием самой длинной подпоследовательности для x[i+1...j]
, x[i,...j-1]
и x[i+1,...,j-1]
(если первая и последняя буквы совпадают).
Во-первых,пустая строка и строка из одного символа тривиально палиндром.Обратите внимание, что для подстроки x[i,...,j]
, если x[i]==x[j]
, мы можем сказать, что длина самого длинного палиндрома является самым длинным палиндромом над x[i+1,...,j-1]+2
.Если они не совпадают, самый длинный палиндром - это максимум из x[i+1,...,j]
и y[i,...,j-1]
.
Это дает нам функцию:
longest(i,j)= j-i+1 if j-i<=0,
2+longest(i+1,j-1) if x[i]==x[j]
max(longest(i+1,j),longest(i,j-1)) otherwise
Вы можете просто реализоватьзапомненную версию этой функции или закодируйте таблицу с самой длинной [i] [j] снизу вверх.
Это дает вам только длину самой длинной подпоследовательности, а не саму фактическую подпоследовательность.Но это может быть легко расширено, чтобы сделать это также.