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

news/2024/6/16 8:51:46 标签: 动态规划, 算法

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;
    }
};

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

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];
    }
};

http://www.niftyadmin.cn/n/5060196.html

相关文章

【计算机网络笔记七】应用层(四)HTTP 通过Content-Type提交数据的方式

1. Content-Type: application/x-www-form-urlencoded 表示纯文本表单提交方式 格式如下&#xff1a; POST /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded Content-Length: 27namezhangsan&gendermale 对应的 Retrofit 代码:…

78评价《乡村振兴战略下传统村落文化旅游旅游设计》许少辉博士新著

78评价《乡村振兴战略下传统村落文化旅游旅游设计》许少辉博士新著 78评价《乡村振兴战略下传统村落文化旅游旅游设计》许少辉博士新著

并查集及其优化

1.并查集 #define SIZE 100 int UFSets[SIZE];void Initial(int S[]) {for (int i 0; i < SIZE; i)S[i]-1; }int Find(int S[], int x) {//查while(S[x] > 0)x S[x];return x; }void Union(int S[], int Root1, int Root2) {//并if(Root1 Root2)return;S[Root2] Roo…

【Django 笔记】第一个demo

1. pip 安装 2. django 指令 D:\software\python3\anconda3\Lib\site-packages\django\bin>django-adminType django-admin help <subcommand> for help on a specific subcommand.Available subcommands:[django]checkcompilemessagescreatecachetabledbshelldiff…

什么是 MyBatis?与 Hibernate 的区别

引言 在现代的应用程序开发中&#xff0c;与数据库的交互是至关重要的。为了简化数据库访问&#xff0c;许多开发者选择使用ORM&#xff08;对象-关系映射&#xff09;框架。MyBatis和Hibernate都是流行的ORM框架&#xff0c;它们可以帮助开发者更轻松地将Java对象映射到数据库…

PHP 二手物品交易网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 二手物品交易网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88385559 二、功能介…

Unity实现设计模式——中介者模式

Unity实现设计模式——中介者模式 用一个中介者对象来封装一系列的对象交互&#xff0c;中介者使各对象不需要显示地相互引用&#xff0c;从而使其松散耦合&#xff0c;而且可以独立地改变它们之间的交互。 这里使用一个生活中的例子来介绍中介者模式&#xff0c;比如当我们在…

Android 12.0 app调用hal层接口功能实现系列一(hal接口的创建)

1.前言 在12.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后通过jni来调用,首先来建立hal层的相关接口和c++文件,提供hal层供上层调用的接口 2.app调用h…