【刷题篇】动态规划(八)

文章目录

  • 1、分割回文串 IV
  • 2、分割回文串 II
  • 3、最长回文子序列
  • 4、让字符串成为回文串的最少插入次数
  • 5、最长公共子序列
  • 6、不相交的线

1、分割回文串 IV

给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。
当一个字符串正着读和反着读是一模一样的,就称其为 回文字符串 。
在这里插入图片描述

class Solution {
public:
    bool checkPartitioning(string s) {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n,false));
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                    dp[i][j]=i+1<j?dp[i+1][j-1]:true;
            }
        }

        for(int i=1;i<n-1;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if(dp[0][i-1]&&dp[i][j-1]&&dp[j][n-1])
                    return true;
            }
        }
        return false;
    }
};

2、分割回文串 II

给定一个字符串 s,请将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的 最少分割次数 。
在这里插入图片描述

class Solution {
public:
    int minCut(string s) {
        int n=s.size();
        vector<vector<bool>> isPal(n,vector<bool>(n));
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                    isPal[i][j]=i+1<j?isPal[i+1][j-1]:true;
            }
        }
        vector<int> dp(n,INT_MAX);
        for(int i=0;i<n;i++)
        {
            if(isPal[0][i])
            {
                dp[i]=0;
            }
            else
            {
                for(int j=1;j<=i;j++)
                {
                    if(isPal[j][i])
                        dp[i]=min(dp[i],dp[j-1]+1);
                }
            }
        }
        return dp[n-1];
    }
};

3、最长回文子序列

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
在这里插入图片描述

class Solution {
public:
    //s[i]==s[j]三种情况    i==j 1  i+1=j 2   i<j  dp[i+1][j-1]+2
    //s[i]!=s[j] max(dp[i][j-1],dp[i+1][j])
    int longestPalindromeSubseq(string s) {
        int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        //i<=j必须
        for(int i=n-1;i>=0;i--)
        {
            dp[i][i]=1;//单拎出来,后面省点事i==j
            for(int j=i+1;j<n;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]);
                }
            }
        }
        return dp[0][n-1];
    }
};

4、让字符串成为回文串的最少插入次数

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s 成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
在这里插入图片描述

class Solution {
public:
    int minInsertions(string s) {
        int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i+1;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=dp[i+1][j-1];
                }
                else
                {
                    dp[i][j]=min(dp[i][j-1],dp[i+1][j])+1;
                }
            }
        }
        return dp[0][n-1];
    }
};

5、最长公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
在这里插入图片描述

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int n=text1.size();
        int m=text2.size();
        vector<vector<int>> dp(n+1,vector<int>(m+1));
        text1=" "+text1;//引入空串会方便我们的初始化
        text2=" "+text2;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(text1[i]==text2[j])//空串方便了这里
                {
                    dp[i][j]=dp[i-1][j-1]+1;//这里会发生越界所以在创建数组时多创建了空间
                }
                else
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[n][m]; 
    }
};

6、不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:
nums1[i] == nums2[j]
且绘制的直线不与任何其他连线(非水平线)相交。
请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。

在这里插入图片描述

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
        int m=nums2.size();
        vector<vector<int>> dp(n+1,vector<int>(m+1));
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(nums1[i-1]==nums2[j-1])//空串方便了这里
                {
                    dp[i][j]=dp[i-1][j-1]+1;//这里会发生越界所以在创建数组时多创建了空间
                }
                else
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[n][m]; 
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈WPF之Popup弹出层

在日常开发中&#xff0c;当点击某控件时&#xff0c;经常看到一些弹出框&#xff0c;停靠在某些页面元素的附近&#xff0c;但这些又不是真正的窗口&#xff0c;而是页面的一部分&#xff0c;那这种功能是如何实现的呢&#xff1f;今天就以一个简单的小例子&#xff0c;简述如…

车辆行驶控制运动学模型的matlab建模与仿真,仿真输出车辆动态行驶过程

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 基本假设 4.2 运动学方程 5.完整工程文件 1.课题概述 车辆行驶控制运动学模型的matlab建模与仿真,仿真输出车辆动态行驶过程. 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a .…

内存分区模型---C++

目录 内存分区模型1.1 程序运行前1.2 程序运行后1.2.1 new操作符 内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff1b;全局区&#xff1a;存放全局变量和静态变量以及常…

微服务自动化.etcd跨主机集群

目录 一、容器间内部通信 二、跨主机通信 1、直接路由 2、Pipework 3、Flannel ①、Flannel特点 三、环境搭建 ETCD版本问题 ①、修改配置文件 ②、api 2 使用方法 ③、 api 3 使用方法 4、 ETCD中保存网络信息 ①、使用v2版的set命令向ETCD中保存flannel覆盖网络信…

111.连接已终止的线程、线程分离、线程取消

一、连接已终止的线程 功能&#xff1a;和一个已经终止的线程进行连接 回收子线程的资源 这个函数是阻塞函数&#xff0c;调用一次只能回收一个子线程 参数&#xff1a;thread&#xff1a;需要回收的子线程的ID retval&#xff1a; 接收子线程推出时的返回值 返回值&#xff1a…

JVM基础(2)——JVM内存模型

一、简介 JVM会加载类到内存中&#xff0c;所以 JVM 中必然会有一块内存区域来存放我们写的那些类。Java中有类对象、普通对象、本地变量、方法信息等等各种对象信息&#xff0c;所以JVM会对内存区域进行划分&#xff1a; JDK1.8及以后&#xff0c;上图中的方法区变成了Metasp…

Java使用IText生产PDF时,中文标点符号出现在行首的问题处理

Java使用IText生成PDF时&#xff0c;中文标点符号出现在行首的问题处理 使用itext 5进行html转成pdf时&#xff0c;标点符号出现在某一行的开头 但这种情况下显然不符合中文书写的规则&#xff0c;主要问题出在itext中的DefaultSplitCharacter类&#xff0c;该方法主要用来判断…

基于ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

C# Open Vocabulary Object Detection 部署开放域目标检测

目录 介绍 效果 模型信息 owlvit-image.onnx owlvit-post.onnx owlvit-text.onnx 项目 代码 Form1.cs OWLVIT.cs 下载 C# Open Vocabulary Object Detection 部署开放域目标检测 介绍 训练源码地址&#xff1a;https://github.com/google-research/scenic/tree/…

性格是如何形成的?能不能改变性格?

有一句话叫“性格决定命运”&#xff0c;广泛流传&#xff0c;也就是说 “命运”与“性格”是紧密相连的&#xff0c;可见“性格”对于一个人的重要性。 性格是怎么来的&#xff1f; 1、遗传基因 根据一些心理学家的最新研究&#xff0c;认为性格与人体内的基因有关系&#x…

浏览器缓存引发的odoo前端报错

前两天&#xff0c;跑了一个odoo16项目&#xff0c;莫名其妙的前端报错&#xff0c; moment.js 报的错&#xff0c; 这是一个时间库&#xff0c;不是我自己写的代码&#xff0c;我也没做过任何修改&#xff0c;搞不清楚为什么报错。以为是odoo的bug&#xff0c;所以从gitee下载…

【Python】编程练习的解密与实战(一)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1fa90;1. 初识Python &a…

RuntimeError: CUDA error: invalid device ordinal解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C#基础-空处理

在c#中&#xff0c;值对象是没有办法赋值为null的。比如说&#xff0c;你想要定义一个布尔值&#xff0c;你的赋值数据要么得是true、要么就得是false&#xff0c;默认情况下我们永远没可能给这个布尔赋值为null&#xff0c;即使只是对这个变量进行声明而不初始化数据&#xff…

ChatGPT会给教育界带来怎样的冲击,又将与教育碰撞出怎样的火花?

11 月 7 日凌晨&#xff0c;美国人工智能公司 OpenAI 的开发者大会正式开启&#xff0c;创始人 Sam Altman 和其同事&#xff0c;发布了团队最新的成果GPT-4 Turbo&#xff0c;新一代的GPT不仅更快、有更长的上下文、而且更好的控制。而随之推出的「GPTs」——让人们能用自然语…

服务器执行rm命令时自动记录到审计日志中

目的 当在服务器上执行类似于 rm 命令时&#xff0c;自动记录该命令执行的时间&#xff0c;在哪里执行的&#xff0c;删除的什么文件&#xff0c;记录到审计日志中&#xff0c;能够查找到某些文件丢失原因 配置 # 需要root权限&#xff0c;sudo不行&#xff0c;这里假设执行…

Java:爬虫htmlunit实践

之前我们已经讲过使用htmlunit及基础&#xff0c;没有看过的可以参考Java&#xff1a;爬虫htmlunit-CSDN博客 我们今天就来实际操作一下&#xff0c;爬取指定网站的数据 1、首先我们要爬取一个网站数据的时候我们需要对其数据获取方式我们要进行分析&#xff0c;我们今天就拿双…

注册中心(Nacos)

简介 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管…

基于DNA的密码学和隐写术综述

摘要 本文全面调研了不同的脱氧核糖核酸(DNA)-基于密码学和隐写术技术。基于DNA的密码学是一个新兴领域,利用DNA分子的大规模并行性和巨大的存储容量来编码和解码信息。近年来,由于其相对传统密码学方法的潜在优势,如高存储容量、低错误率和对环境因素的抗性,该领域引起…

网络之路28:二层链路聚合

正文共&#xff1a;1666 字 14 图&#xff0c;预估阅读时间&#xff1a;2 分钟 目录 网络之路第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章&#xff1a;认识企业设备…