LeetCode 516. Longest Palindromic Subsequence详细图文解析 问题描述 一个例子:

https://leetcode.com/problems/longest-palindromic-subsequence/description/ 

一个例子:

LeetCode 516. Longest Palindromic Subsequence详细图文解析
问题描述
一个例子:

令数组为a,画一个行列为a长度的矩阵,令为T

首先看长度等于1的情况:

也就是只看一个元素,比如只看a[0]这个元素,也就是一个a,显然最长回文序列是1。只看a[1],即g,显然最长回文序列为1。其实也就是

T[i][j] (i==j)的元素位置全置为1。

看长度为2的情况:

先看a[0~1],也就是a,g。

  • 先看a和g是否相等,相等则在各自长度为1的情况下的最长回文序列的前提上加2,
  • 否则划分成子问题,看成长度为1的a,和长度为1的g,之前得出的矩阵中(T[0][0]和T[1][1])可以看出分别为1 ,1.
  • 条件2符合,因此取T[0][0]和T[1][1]中较大值,即1

由以上两个考虑得出a,g最长回文序列为T[0][1]=1.

在看a[1~2],也就是g,b。

  • 先看g和b是否相等,相等则在各自长度为1的情况下的最长回文序列的前提上加2,
  • 否则划分成子问题,看成长度为1的g,和长度为1的b,之前得出的矩阵中(T[1,1]和T[2][2])可以看出分别为1 ,1.
  • 条件2符合,因此取T[0][0]和T[1][1]中较大值,即1

......

看长度为3的情况:

先看a[0~2],也就是a g b。

  • 先看a和b是否相等,相等则在各自长度为2的情况下的最长回文序列的前提上加2,
  • 否则划分成子问题,看成长度为2的a g(T[0][1]=1),和长度为2的g b,(其T[1][2]=1),之前得出的矩阵中(T[0][1]和T[1][2])可以看出分别为1 ,1.
  • 条件2符合,因此取T[0][0]和T[1][1]中较大值,即1

 在看a[1~3],需要填充的是T[1][3]的值,也就是g b d。

  • 先看g和b是否相等,相等则在各自长度为2的情况下的最长回文序列的前提上加2,
  • 否则划分成子问题,看成长度为2的g b(T[1][2]=1),和长度为2的g b,(其T[2][3]=1),之前得出的矩阵中(T[1][2]]和T[2][3])可以看出分别为1 ,1.
  • 条件2符合,因此取T[0][0]和T[1][1]中较大值,即T[1][3]=1

再看a[2~4],需要填充的是T[2][4]的值,也就是b d b。

  • 先看b和b是否相等,相等则在各自长度为2的情况下的最长回文序列的前提上加2,
  • 否则划分成子问题,看成长度为2的b d(T[2][3]=1),和长度为2的d b,(其T[3][4]=1),之前得出的矩阵中(T[1][2]]和T[2][3])可以看出分别为1 ,1.
  • 条件1是符合的,因此取T[i+1][j-1]的值(也就是T[3][3])+2,即T[2][4]=3

看一下图示:

LeetCode 516. Longest Palindromic Subsequence详细图文解析
问题描述
一个例子:

重复上述步骤即可

上述步骤用代码描述如下:

LeetCode 516. Longest Palindromic Subsequence详细图文解析
问题描述
一个例子:

结果图:

LeetCode 516. Longest Palindromic Subsequence详细图文解析
问题描述
一个例子:

LeetCode 516. Longest Palindromic Subsequence详细图文解析
问题描述
一个例子:

 如果要输出回文序列,则可以看这样的箭头指,由那个指向线,可以看出:

从0 5 (T[0][5])开始 即 a a。

然后左下角的3是从正下方的3来的,即 2  4(T[2][4])来的  即a b b a。

然后3又是从1来的,即3 3 (T[3][3])也就是 d。

得到最长回文序列如下。

a b d b a

参考:

https://blog.csdn.net/xiaocong1990/article/details/54976319

https://www.youtube.com/watch?v=_nCsPn7_OgI&list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr&index=9