一、回文串
1、题目描述
2、算法分析
1)dp含义
boolean类型的dp表示 区间范围[i,j]内的子串是否是回文串 ,如果是dp[i][j]为true,否则为false,最后再统计dp中true的个数就是原数组回文串的个数;
2)递推公式
在确定递推公式前,我们需要明确几种情况:
整体上就是两类情况,s[i]与s[j]是否相等
当s[i]和s[j]不相等,那么dp[i][j]一定为false
当s[i]与s[j]相等,有三类情况需要讨论:
情况1: 下标i和下标j相同,同一个字符,那么一定是回文
情况2:下标i和下标j相差为1,例如aa,也是回文
情况3: 下标i和下标j相差大于1,例如cabac,此时s[i]与s[j]相等,要肯定[i,j】是不是回文,需要判断aba是不是回文就行,也就是缩小区间i+1和j-1区间,等效于看dp[i+1][j-1]是否为true
if (s[i] == s[j]) {
if (j - i <= 1) { // 情况一 和 情况二
result++;
dp[i][j] = true;
} else if (dp[i + 1][j - 1]) { // 情况三
result++;
dp[i][j] = true;
}
}
3)dp初始化
刚开始都是没有匹配的情况,所以初始化为0
4)遍历顺序
要注意这里的遍历顺序!!!!
从递推公式中我们可以发现,情况3需要判断dp[i+1][j-1]是否为true,然后才对dp[i][j]进行赋值