首先需要强调的一点是:子序列不同于子串,子串要求必须连续,而子序列则不需要,与本篇讨论的这个问题比较相似的一个问题就是求一个字符串的最长回文子串,这个问题我们在下一篇会进行讨论。
这里我们说两种解这道题的方法:
方法一:
这个方法是一个比较巧妙的思路, 只要把原字符串逆转后和原字符串比较并且利用求最长公共子序列的方式求出LCS即可得到最长回文子序列。也就是说求出的LCS=最长回文子序列。
方法二:
即针对本题的动态规划解法,同样,思路依旧是源于经典的dp问题最长公共子序列,两者的状态转移方程和最优子结构有其相似之处,
最优子结构:
假设 X[0 … n-1] 是给定的序列,长度为n 。让 L(0,n-1) 表示 序列 X[0 … n-1] 的最长回文子序列的长度。
如果X的最后一个元素和第一个元素是相同的,这时:L(0, n-1) = L(1, n-2) + 2 , 还以 “BBABCBCAB” 为例,第一个和最后一个相同,因此 L(1,n-2) 就表示蓝色的部分。
如果不相同:L(0, n-1) = MAX ( L(1, n-1) , L(0, n-2) )。 以”BABCBCA” 为例,L(1,n-1)即为去掉第一个元素的子序列,L(0, n-2)为去掉最后一个元素。