这还是我认识的动态规划吗?
动态规划方法:
动态规划五部曲:
1、确定dp数组下标及其含义
2、确定递推公式
3、dp数组初始化
4、确定遍历顺序
5 、写状态转移方程
第一步:dp[i][j]表示区间范围[i,j]之间的字串是否是回文字符串,是的话为true,否则为false
第二步:
当str[i]!=str[j]时,肯定不是回文串
当str[i]=str[j]时,分为以下情况:
- i=j,这种情况肯定是回文字符串
- i!=j,但是i和j之间仅相差1,也是回文字符串
- i!=j,i和j之间相差大于1,需要判断[i+1,j-1]区间
递推公式如下
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;
}
}
第三步:
dp[i][j]初始化为false
第四步:确定遍历顺序
这里情况比较特殊,根据dp[i+1][j-1]是否为true,对dp[i][j]进行赋值,所以在遍历的时候需要从下往上,从左往右进行遍历。
第五步:举例推导dp数组
输入“aaa”,dp数组如下: