【动态规划算法练习】day11

news/2024/6/16 11:54:35 标签: 算法, 动态规划, leetcode

文章目录

  • 一、1312. 让字符串成为回文串的最少插入次数
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 二、1143. 最长公共子序列
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 三、1035. 不相交的线
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 总结


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

1.题目简介

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

2.解题思路

3.代码

class Solution {
public:
    int minInsertions(string s) {
        int n = s.size();
        //1.判断出字符串中最长回文子序列
        vector<int> v(n, 0);
        vector<vector<int>> dp(n, v);
        //dp[i][j]表示以i为结尾以j为开始的最长回文子序列元素个数
        //初始化
        for(int i = 0;i < n; ++i)
        {
            dp[i][i] = 1;
        }
        for(int i = 0;i < n; ++i)
        {
            for(int j = i - 1;j >= 0; --j)
            {
                if(s[i] == s[j])//如果相等,则回文子序列加2元素
                {
                    dp[i][j] = dp[i - 1][j + 1] + 2;
                }
                else//如果不相等,则它的回文子序列为i或j往前遍历一个位置对应的回文子序列的较大值
                {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j + 1]);
                }
            }
        }
        int a = dp[n - 1][0];
        //2.用总元素个数减去最长回文子序列的元素个数
        return n - a;
    }
};

4.运行结果

在这里插入图片描述

二、1143. 最长公共子序列

1.题目简介

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

2.解题思路

3.代码

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<int> v(text2.size() + 1, 0);
        vector<vector<int>> dp(text1.size() + 1, v);
        //dp[i][j]表示以i - 1为结尾的text1字符串和以j - 1为结尾的text2这两个字符串的最长公共子序列(为啥要-1呢?为了方便计算i - 1和j - 1的值,而不用很麻烦的初始化i=0和j=0的情况,实际上就是将i和j作为了长度而不是坐标)
        for(int i = 1;i <= text1.size(); ++i)
        {
            for(int j = 1;j <= text2.size(); ++j)
            {
                if(text1[i - 1] == text2[j - 1])//如果i和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[text1.size()][text2.size()];
    }
};

4.运行结果

在这里插入图片描述

三、1035. 不相交的线

1.题目简介

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

2.解题思路

3.代码

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<int> v(nums2.size() + 1, 0);
        vector<vector<int>> dp(nums1.size() + 1, v);
        //实际上就是在求:以i为结尾的nums1数组和以j结尾的nums2数组两者之间的最长公共子序列
        for(int i = 1;i <= nums1.size(); ++i)
        {
            for(int j = 1;j <= nums2.size(); ++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[nums1.size()][nums2.size()];
    }
};

4.运行结果

在这里插入图片描述


总结

今天是算法练习的第11天。
长风破浪会有时,直挂云帆济沧海,继续加油。
文中题目来源:力扣(LeetCode),著作权归领扣网络所有。
如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!


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

相关文章

路由基础静态路由

路由基础&静态路由 一、路由器基本原理1.1、路由器基本概述1.2、LAN和广播域1.3、路由选路1.3.1、路由器转发数据包1.3.2、IP路由表1.3.3、建立路由表1.3.4、最长匹配原则1.3.5、路由优先级1.3.6、路由度量1.3.7、等价路由 1.4、总结 二、静态路由基础2.1、静态路由配置2.2…

(嵌入式)STM32G061C8T6、STM32G061C6T6、STM32G061C8U6 64MHz 64KB/32KB 闪存(MCU)

STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用&#xff0c;并可随时用于物联网 (IoT) 解决方案。这些微控制器具有很高的集成度&#xff0c;基于高性能ARM Cortex-M0 32位RISC内核&#xff0c;工作频率高达64MHz。该器件包含内存保护单元 (MPU)、高速嵌入式内…

浅浅总结一下雅思听力技巧

1. 地图题 读题步骤要明确 &#xff08;1&#xff09;看图&#xff0c;要看看题目中是否有东南西北的标志&#xff0c;如果有的话&#xff0c;那么大概率题目中就会用到。同时也标记好左右的标志&#xff0c;防止考试的时候太紧张分不清。 弄清楚个元素的相对位置&#xff0…

MySql的MVCC_存储引擎_历史_开发模式

概览 一. 多版本并发控制(MVCC)1.概述2.InnoDB的MVCC 二.MySql的存储引擎 一. 多版本并发控制(MVCC) 1.概述 可以认为MVCC是行级锁的一个变种,其在很多情况下避免了加锁操作&#xff0c;因此开销更低。 不同存储引擎的MVCC实现是不同的&#xff0c;但大部分实现了非阻塞的读…

logstash收集日志到elasticsearch

1.前言 logstash是一个相对较重的日志收集器&#xff0c;可以通过多种方式获取到日志数据&#xff0c;如tcp、日志文件、kafka、redis、rabbitmq等方式&#xff0c;还可以使用filter去过滤日志、转换日志为json格式&#xff0c;所以logstash是一个功能强大的日志收集器&#x…

Redis的持久化机制(1)

RDB&#xff0c;即Redis DataBase的简称。RDB是Redis默认的持久化机制 RDB持久化文件&#xff0c;速度比较快&#xff0c;而且存储的是一个二进制的文件&#xff0c;传输起来很方便 在指定的时间间隔内&#xff0c;将内存中的数据集的快照写入磁盘。默认保存在/usr/local/bin目…

安卓水果店的设计与实现

1.项目概述 随着科学技术和社会经济的不断提高&#xff0c;人们对服务的快捷、便利性要求也越来越高&#xff0c;从而对智能手机上的应用软件提出了更高的要求。一个基于安卓技术的水果系统能够为用户提供一个方便日常操作的便捷点餐功能,它能够满足广大手机用户的对日常水果的…

【Linux】服务器22端口开启

目录 1. Linux 22 端口 2. 开启 22 端口 1. Linux 22 端口 Linux 中 22 端口是 ssh 应用端口用以进行远程访问&#xff0c;正常情况下 Linux 服务器要打开 22 端口。 如下命令检查服务器是否启用 22 端口&#xff1a; netstat -tln | grep 22 如果结果出现 xxx:22 等结果…