这可以使用动态规划在 O(n^2) 内解决。基本上,问题是建立最长的回文子序列x[i...j]
使用最长的子序列x[i+1...j]
, x[i,...j-1]
and x[i+1,...,j-1]
(如果第一个和最后一个字母相同)。
首先,空字符串和单个字符串通常是回文。
请注意,对于子字符串x[i,...,j]
, if x[i]==x[j]
,我们可以说最长回文串的长度是最长回文串的长度x[i+1,...,j-1]+2
。如果不匹配,则最长回文数是其中的最大值x[i+1,...,j]
and 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]表。
这仅给出最长子序列的长度,而不是实际的子序列本身。但它也可以很容易地扩展来做到这一点。