LongestPalindromicSubsequence 最长回文子序列

问题

序列ss的回文子序列是原序列的子集,元素在原序列中是连续的,回文子序列的前半段和后半段是颠倒的(倒序的前半段与后半段相同)。例如s=[1,2,3,2,1]s = [1,2,3,2,1]的回文子序列有

[1,2,3,2,1],[2,3,2],[3],[][1,2,3,2,1],[2,3,2],[3],[]

求序列ss的最长回文子序列。

解法

设序列ss长度为nn(数组从11开始,范围[1,n][1,n])。设f(i,j)f(i,j)表示s=[i,j]s = [i,j]是否为回文子序列,则有状态转移方程:

f(i,j)={true(initialize)i,j[1,n],i=jfalse(initialize)i,j[1,n],ijf(i+1,j1)s[i]=s[j](loop)1in1,2jnf(i,j) = \begin{cases} true & (initialize) & i,j \in [1,n], i=j \\ false & (initialize) & i,j \in [1,n], i \neq j \\ f(i+1,j -1) \land s[i] = s[j] & (loop) & 1 \leq i \leq n-1, 2 \leq j \leq n \\ \end{cases}

(1)(1) 初始化,对于单个元素s[i]s[i],显然单个元素可以作为一个最短的回文子序列,即f(i,i)=truef(i,i) = true,其他则初始化为f(i,j)=false,ijf(i,j) = false, i \neq j

(2)(2) 对于子序列s[i+1,j1]s[i+1,j-1],若其为回文子序列且s[i]=s[j]s[i]=s[j]则扩展后s[i,j]s[i,j]也是回文子序列,若s[i+1][j1]s[i+1][j-1]不是回文子序列或s[i]s[j]s[i] \neq s[j]s[i,j]s[i,j]也不是回文子序列;

遍历所有f(i,j),1ijnf(i,j), 1 \leq i \leq j \leq n找出最大值fmax(imax,jmax)f_{max} (i_{max}, j_{max}),即为最长回文子序列s[imax,jmax]s[i_{max}, j_{max}]。该算法的时间复杂度为O(n2)O(n^2)

LeetCode

leetcode-5.cpp

源码

LongestPalindromicSubsequence.h

LongestPalindromicSubsequence.cpp

测试

LongestPalindromicSubsequenceTest.cpp

Last updated