证明LPS为字符串与其反转后形成字符串的LCS

2019-11-19  本文已影响0人  江海小流

LPS: Longest Palindrome Subsequence 最长回文子序列
LCS: Longest Common Subsequence 最长公共子序列

对于一个字符串 abba,它的最长回文子序列就是它本身,它与它的反转abba 的最长公共子序列也是 abba。那么,一个字符串的最长回文子序列是否为该字符串与它的反转的最长公共子序列?

1 LCS的求解方法

一般使用动态规划的方法求解 LCS问题。具体来说,对于字符串 s_1s_2, 定义 dp[i][j] 表示 s_1[:i]s_2[:j] 的最长公共子序列的长度。其中,s[:i] 表示字符串 s 的长度为 i 的前缀。

对于 dp[i][j],有如下转移:

例如,对于字符串 abaacba,其DP[\cdot][\cdot]内容如下:

图1: 字符串abaacba的DP内容示例

2 LPS与LCS

假设字符串 s_2 为 字符串 s_1 的反转,假设字符串 s_1 的长度为 n,那么

该性质对应到 LCS问题中的DP图时,可以看到

如果从反对角线上的某一点(存在蓝色线条通过)出发,分别生成两条路径:

两条路径合起来,就是一个 DP 具体的转移方式,是一个 Common Subsequence。而对于某一个点生成的两条路径,假设该路径会经过最多的红点,因为红点是对称的,

枚举这样所有的点,求出来的最长的 Common Subsequence,就是两个字符串的 LCS。同时,这条路径是按照反对角线对称的。因此,生成的LCS就是LPS。

上一篇 下一篇

猜你喜欢

热点阅读