算法训练营day47 | {647.回文子串, 516.最长回文子序列}
第九章动态规划-part13,动规最后一天!
647. 回文子串
- 题目链接:647. 回文子串
- 文档讲解:代码随想录
- 视频讲解:动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串
- 状态:动态规划解决的经典题目,之前没接触过,直接看视频了。
1.1 解题分析
之前做过的子序列题目,在定义dp数组时,题目求什么,我们就如何定义dp数组,但是本题这样定义很难找到递推关系。我们的dp数组要定义成一个二维dp数组,即**布尔类型的dp[i][j]**,表示区间范围[i,j]的子串是否是回文串,如果是,dp[i][j]为true,否则为false。
字符串s = “aaa”
1
2
3
4
5
6
7
a
a
a
aa
aa
aaa
输出6
1 | |
DP五部曲:
- dp数组定义:
- dp[i][j]表示闭区间[i,j]范围的子串是否是回文串。
- 递推公式:
- if (s[i] == s[j]) 有三种情况:
- i == j a
- i j相差1 aa
- j - i > 1 此时要继续看里面的子串是否为回文串
- 同时记录回文子串的数量。
- if (s[i] == s[j]) 有三种情况:
- 初始化:
- 全部为false
- 遍历顺序:依据递推公式,本题遍历从下到上,从左到右。
- 打印dp数组。
1.2 解题小结
- 打印dp数组发现只有右半边有更新值。
1
2
3true true true
false true true
false false true
▶
647. 回文子串1 | |
516. 最长回文子序列
- 题目链接:516.最长回文子序列
- 文档讲解:代码随想录
- 视频讲解:动态规划再显神通,LeetCode:516.最长回文子序列
- 状态:本题和回文子串的区别是不要求连续。
2.1 解题分析
DP五部曲:
- dp数组定义:
- dp[i][j]表示闭区间[i,j]范围内的最长回文子序列的长度。
- 递推公式:
- if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2
- else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
- 初始化:
- dp[i][i] = 1 i和j往中间靠拢
- 遍历顺序:依据递推公式,应从下到上,从左到右遍历。
- 打印dp数组。
2.2 解题小结
▶
516.最长回文子序列1 | |
3. 动态规划专题总结
- 动规系列,做过:
- 动态规划基础
- 背包
- 打家劫舍
- 股票买卖
- 子序列
- 将本篇列举的DP题目都掌握,足以应对面试,详情见代码随想录动态规划总结篇。
4. 今日收获
- 一口气补3天,子序列还可以。
- 学习时长:2.5小时
算法训练营day47 | {647.回文子串, 516.最长回文子序列}
http://paopaotangzu.xyz/cn/day47_leetcode/