• 代码随想录day动态规划回文子串


    647.回文子串

    递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于子字符串(下表范围[i + 1, j - 1] )是否是回文。
    1.布尔类型的dp[i][j] :表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
    2.

    • 当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false
    • 当s[i]与s[j]相等,情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串;情况二:下标i 与 j相差为1,例如aa,也是回文子串;情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

    3.初始化:都为false
    4.遍历顺序:一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。

    class Solution {
    public:
        int countSubstrings(string s) {
            vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
            int result=0;
            for(int i=s.size()-1;i>=0;i--){
                for(int j=i;j<s.size();j++){
                    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;}
                    }
                }
            }
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    双指针法也可以,空间复杂度减小。以字符串每一个,或者两个字符为中心像两边扩散看是否是回文串。

    516.最长回文子序列

    回文子串是要连续的,回文子序列可不是连续的!所以比上一题简单。

    class Solution {
    public:
        int longestPalindromeSubseq(string s) {
            vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
            for (int i = 0; i < s.size(); i++) dp[i][i] = 1;
    
            for(int i=s.size()-1;i>=0;i--){
                for(int j=i+1;j<s.size();j++){
                    if(s[i]==s[j])
                        dp[i][j]=dp[i+1][j-1]+2;
                    else
                        dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                }
            }
            return dp[0][s.size() - 1];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    7、GC日志详解
    【项目管理】Java OCR实现图片文字识别
    弘玑Cyclone2022产品发布会:超级自动化下的流程挖掘——弘观流程智能
    Tekton 设计简介 及 实践
    Android NDK篇-C++语言之运算符重载 与多继承二义性
    什么是云计算?云计算简介
    JAVA设计模式 —— 软件设计六大原则
    this is incompatible with sql_mode=only_full_group_by解决方案
    [Kettle] 生成随机数
    DBeaver连接开启sm3认证的瀚高数据库
  • 原文地址:https://blog.csdn.net/qq_45789731/article/details/133440726