一尘不染

如何找到最长回文子序列?

algorithm

这是算法书(由Vazirani撰写)中的问题(6.7ch6)与发现最长回文的经典问题略有不同。我怎么解决这个问题 ?

如果从左到右或从右到左读取相同,则子序列是回文的。例如,序列

A,C,G,T,G,T,C,A,A,A,A,T,C,G

具有许多回文序列,包括A,C,G,C,AA,A,A,A (另一方面,该子序列A,C,T不是回文序列 )。设计一个采用序列x[1 ...n]并返回最长回文子序列(的长度)的算法。它的运行时间应该是O(n^2)


阅读 266

收藏
2020-07-28

共1个答案

一尘不染

可以使用动态编程在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

您可以简单地实现该功能的记忆版本,或编写一个自下而上的longest [i] [j]表。

这仅给您最长子序列的长度,而不是实际子序列本身。但是它也可以很容易地扩展为做到这一点。


2020-07-28