代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇

647. 回文子串

链接:代码随想录

动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解

代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第1张图片

 代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第2张图片

 做法一:暴力遍历

class Solution {
//普通做法,暴力遍历,判断是否回文
public:
    int num=0;
    int countSubstrings(string s) {
        int n=s.size();
        for(int i=0;i=0 && right

动态规划做法,看了答案。

难点在于递推顺序,以及递推公式的构建和理解。

dp[i][j]相比前面的一些跟子序列、编辑距离相关的做法,取消了第0行第0列,dp[i][j]本身代表s[i...j]左闭右闭字符串是否为回文字符串。

代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第3张图片

 以字符串"abdba"为例:

代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第4张图片

class Solution {
/*动态规划,比较难以理解,建立在答案之上。
遍历顺序是从左下角开始的,也需要注意。
老实说,我感觉我理解了,能跟着老师思路顺下来,但是自己
想不到。

*/
public:
    int countSubstrings(string s) {

        int n=s.size();
        int cnt=0;//记录回文串个数
        //定义
        vector>dp(n,vector(n,false));
        //初始化
        for(int i=0;i=0;i--)
        {
            for(int j=i;j

516.最长回文子序列

647. 回文子串,求的是回文子串,而本题要求的是回文子序列, 大家要搞清楚两者之间的区别。

链接:代码随想录

代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第5张图片

代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第6张图片

 答案这里没有想到。感觉理解的不是很透彻。

代码随想录|day57|动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇_第7张图片

class Solution {
/*
这个同时结合了最长公共子序列和回文子串的感觉!真神奇。
dp递推公式还是相当于没推理出来
*/
public:
    int longestPalindromeSubseq(string s) {
        int n=s.size();
        vector>dp(n,vector(n,0));
        for(int i=0;i=0;i--)
        {
            for(int j=i+1;j

动态规划总结篇。留到周末看。

代码随想录

你可能感兴趣的:(代码随想录,动态规划,算法,c++)