首先我们来想一下动态规划的五部曲:
1、确定dp数组以及下标的含义;
2、确定递推公式;
3、dp数组的初始化;
4、确定遍历顺序;
5、举例推导dp数组;
五部曲的第一步:确定dp数组以及下标的含义
我们定义一个boolean的二维数组来作为dp数组,下标i和j分别表示数组的行和列
五部曲的第二步:确定递推公式
上图中有三种情况可以得到回文子串:
1、当i==j时,也就是数组的对角线都是单个字母,即可认为是回文子串
2、当i==j+1时,也就是两个相邻的字符相同是回文子串;
3、当j>i+1时,我们不仅得判断第i个和第j个字符相同,还得判断数组第i+1和第j-1个是否为true(目的是为了判断aba中两a中的字符串是否为回文子串,如下图);
五部曲的第三步:dp数组的初始化;
boolean数组的默认值是null所以我们可以不用初始化或者可以初始化为false;
五部曲的第四步:确定遍历顺序;
注意遍历顺序,我们需要从j先往下遍历因为在数组里面找到一个true时,就需要判断往数组的左下角的布尔值,所以我们不同以往得从数组的列开始往下遍历
五部曲的第五步:举例推导dp数组;
以下是完整代码