代码随想录算法训练营第五十六天|647. 回文子串|516.最长回文子序列

一、647. 回文子串

思想:这题不好想的是dp的含义,我最开始也是用dp[i]表示以i结尾的字符串的回文子串的数目,发现递归公式根本推出来。所以dp[i][j]定义如图所示,然后就是推递归公式,首先是值相同的情况,值相同又可以分为i,j相同,i,j相差为1,i,j相差大于1,然后你可以发现前两种情况都是回文子串,大于1的情况取决于dp[i+1][j-1]是否是回文子串。然后遍历顺序你可以通过做图来确定,你会发现dp[i][j]是从左下角推出的,所以你的遍历顺序从下往上,从左往右。

代码随想录算法训练营第五十六天|647. 回文子串|516.最长回文子序列_第1张图片

 二、516.最长回文子序列

思想:其实这题和上题其实很像,它们的主要区别是连续与否,但是它们的dp定义确大不一样。dp定义如图,然后就是递归公式,值相同,这个好理解,两个值相同了,长度是中间片段的长度加二,然后是值不同的情况,因为两边肯定不能同时取,所以在首尾取一个分为两种,dp[i+1][j]和dp[i][j-1]取它们之间的最大值即可。然后就是初始化的问题,因为我们这里推导的情况是i和j是不同的情况,并没有讨论它们相同的情况很明显,i,j相同表明是一个字符,就是一个回文子序列长度为1,所以我们初始化的时候将这种情况考虑进去,然后遍历顺序可以画二维图可以看出dp[i][j]是从左,左下角,和下推出。遍历顺序从下往上,从左往右。

代码随想录算法训练营第五十六天|647. 回文子串|516.最长回文子序列_第2张图片

 

你可能感兴趣的:(算法,动态规划)