最长回文子序列(dp解决方案)

时间:2019-01-24 13:03:52

标签: algorithm dynamic-programming subsequence lcs

在此问题的多个dp解决方案中,一个更简单的解决方案是反转给定的字符串并计算原始字符串和反转字符串的LCS。

我的问题是,这种方法每次都能产生正确的结果吗?
例如, ACBAC 及其反向的 CABCA 的最长公共子序列是 ABC ,这不是回文,但是仍然可以得出正确的结果由于其他LCS是回文 ACA,CAC

那么,即使可能存在非回文式LCS,这种方法每次也会产生正确的结果吗?

dp表,如果有帮助的话。

    A C B A C
  0 0 0 0 0 0 
C 0 0 1 1 1 1 
A 0 1 1 1 2 2 
B 0 1 1 2 2 2 
C 0 1 2 2 2 3 
A 0 1 2 2 3 3  

1 个答案:

答案 0 :(得分:5)

是的,这是正确的。以下两个事实暗示了这一点,它们共同暗示了所需的平等性。

  1. 最长回文子序列最多与字符串及其反向的最长共同子序列一样长。

  2. 最长回文子序列至少与字符串及其反向的最长共同子序列一样长。

事实1很容易证明:字符串的每个回文子序列当然都是一个子序列,并且它是字符串反向的一个子序列,因为当且仅当reverse(S1)是反向的一个子序列时,S1才是S2的一个子序列。 (S2),而回文序列本身就是相反的。

事实2比较微妙。我们认为,给定一个字符串的LCS及其反向,我们可以得出两个回文序列,其平均长度等于LCS。紧随其后的是一个平均论点,即一个或两个都至少等长。

我将通过您的示例来说明构建过程。写下公共子序列以及字符串中的索引。

A C B A C
1 2 3 4 5
A   B   C
 \  |  /
  A B C
5 4 3 2 1
C A B C A

我们提取A (1, 4); B (3, 3); C (5, 2)。我们可以通过使用第一个数字不超过第二个的前缀并镜像它来1, 3, 4 -> A B A来得出一个回文。我们从第二个数字不超过第一个数字的后缀以镜像方式派生另一个:2, 3, 5 -> C B C

 A  B  C
 1  3  5
.>>\ />>
   | |
 <</ \<<.
 4  3  2
 A  B  C

观察到该子序列的每个字母正好被使用两次(一次去一次,除了中间,在两个回文中都使用一次),因此我们对均值的观察成立。