[Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解
目录
- 1.正则表达式匹配
- 1.题目链接
- 2.算法原理详解
- 3.代码实现
- 2.交错字符串
- 1.题目链接
- 2.算法原理详解
- 3.代码实现
- 3.两个字符串的最小ASCII删除和
- 1.题目链接
- 2.算法原理详解
- 3.代码实现
- 4.最长重复子数组
- 1.题目链接
- 2.算法原理详解
- 3.代码实现
1.正则表达式匹配
1.题目链接
- 正则表达式匹配
2.算法原理详解
- 思路:
-
确定状态表示 ->
dp[i][j]的含义dp[i]j]:p的[0, j]区间内的子串能否匹配s的[0, i]区间内的子串
-
推导状态转移方程:根据最后一个位置的情况,分情况讨论
-
结论

-
推导过程

-
本题若直接按照如下的状态转移方程去写,时间复杂度会到 O ( N 3 ) O(N^3) O(N3)
-
所以需要想办法优化
-
-
优化:
-
方法一:数学推导

-
方法二:根据状态表示以及实际情况,优化状态转移方程 -> 抽象,难理解:(
- 实际相当于保留了
*,把状态传递给前面

- 实际相当于保留了
-
-
初始化:
- 多开一行及一列虚拟结点

- 多开一行及一列虚拟结点
-
确定填表顺序:从上往下,从左往右
-
确定返回值:
dp[n][m]
-
3.代码实现
bool isMatch(string s, string p)
{int n = s.size(), m = p.size();s = " " + s, p = " " + p;vector<vector<bool>> dp(n + 1, vector<bool>(m + 1));// Initdp[0][0] = true;for(int i = 2; i <= m; i += 2){if(p[i] == '*'){dp[0][i] = true;}else{break;}}// DPfor(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(p[j] == '*'){dp[i][j] = dp[i][j - 2] || (p[j - 1] == '.' || p[j - 1] == s[i]) && dp[i - 1][j];}else{dp[i][j] = (p[j] == s[i] || p[j] == '.') && dp[i - 1][j - 1];}}}return dp[n][m];
}
2.交错字符串
1.题目链接
- 交错字符串
2.算法原理详解
-
预处理:
s1 = " " + s1, s2 = " " + s2, s3 = " " + s3- 目的:此时可以很简便的用
s1和s2的下标就计算到s3的的下标

- 目的:此时可以很简便的用
-
思路:
-
确定状态表示 ->
dp[i][j]的含义dp[i]j]:s1的[1, i]区间内的字符串以及s2的[1, j]区间内的字符串,能否拼接凑成s3的[1, i + j]区间内的字符串
-
推导状态转移方程:根据最后一个位置的情况,分情况讨论

-
初始化:
- 多开一行及一列虚拟结点

- 多开一行及一列虚拟结点
-
确定填表顺序:从上往下,从左往右
-
确定返回值:
dp[n][m]
-
3.代码实现
bool isInterleave(string s1, string s2, string s3)
{int n = s1.size(), m = s2.size();if(n + m != s3.size()) return false;s1 = " " + s1, s2 = " " + s2, s3 = " " + s3;vector<vector<bool>> dp(n + 1, vector<bool>(m + 1));// Initdp[0][0] = true;for(int i = 1; i <= m; i++) // 第一行{if(s2[i] == s3[i]){dp[0][i] = true;}else{break;}}for(int i = 1; i <= n; i++) // 第一列{if(s1[i] == s3[i]){dp[i][0] = true;}else{break;}}// DPfor(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){dp[i][j] = (s1[i] == s3[i + j] && dp[i - 1][j])|| (s2[j] == s3[i + j] && dp[i][j - 1]);}}return dp[n][m];
}
3.两个字符串的最小ASCII删除和
1.题目链接
- 两个字符串的最小ASCII删除和
2.算法原理详解
- 问题转化:删除后,公共子序列中,ASCII和最大的 —> 正难则反
- 思路:
-
确定状态表示 ->
dp[i][j]的含义dp[i]j]:s1的[0, i]区间以及s2的[0, j]区间内的所有的子序列里,公共子序列ASCII最大和
-
推导状态转移方程:根据最后一个位置的情况,分情况讨论

-
初始化:
vector<vector<int>> dp(n + 1, vector<int>(m + 1)) -
确定填表顺序:从上往下,从左往右
-
确定返回值:
- 统计2个字符串的ASCII和
sum sum - dp[n][m] * 2
- 统计2个字符串的ASCII和
-
3.代码实现
int minimumDeleteSum(string s1, string s2)
{int n = s1.size(), m = s2.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++){dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);if(s1[i - 1] == s2[j - 1]){dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + s1[i - 1]);}}}int ret = 0;for(auto& ch : s1){ret += ch;}for(auto& ch : s2){ret += ch;}return ret - dp[n][m] * 2;
}
4.最长重复子数组
1.题目链接
- 最长重复子数组
2.算法原理详解
- 思路:
-
确定状态表示 ->
dp[i][j]的含义dp[i]:选取[0, i]一段区间内的所有子数组 ×- 因为此时无法知道最长子数组在哪儿,可能在中间,此时无法正确表示状态
dp[i][j]:nums1[i]中以i位置元素为结尾的所有的子数组以及nums2中以j位置元素为结尾的所有的子数组中,最长重复子数组的长度
-
推导状态转移方程:根据最后一个位置的情况,分情况讨论

-
初始化:
vector<vector<int>> dp(n + 1, vector<int>(m + 1)) -
确定填表顺序:从上往下
-
确定返回值:
dp表里面的最大值
-
3.代码实现
int findLength(vector<int>& nums1, vector<int>& nums2)
{int n = nums1.size(), m = nums2.size();vector<vector<int>> dp(n + 1, vector<int>(m + 1));int ret = 0;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;ret = max(ret, dp[i][j]);}}}return ret;
}
相关文章:
[Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解
目录 1.正则表达式匹配1.题目链接2.算法原理详解3.代码实现 2.交错字符串1.题目链接2.算法原理详解3.代码实现 3.两个字符串的最小ASCII删除和1.题目链接2.算法原理详解3.代码实现 4.最长重复子数组1.题目链接2.算法原理详解3.代码实现 1.正则表达式匹配 1.题目链接 正则表达…...
Ffmpeg安装和简单使用
Ffmpeg安装 下载并解压 进入官网 (https://ffmpeg.org/download.html),选择 Window 然后再打开的页面中下滑找到 release builds,点击 zip 文件下载 环境变量配置 下载好之后解压,找到 bin 文件夹,里面有3个 .exe 文件 然后复制…...
29、matlab算数运算汇总2:加、减、乘、除、幂、四舍五入
1、乘法:times, .* 语法 C A.*B 通过将对应的元素相乘来将数组 A 和 B 相乘。 C times(A,B) 是执行 A.*B 的替代方法, 1)将两个向量相乘 代码及运算 A [1 0 3]; B [2 3 7]; C A.*BC 2 0 212) 将两个数组相乘 代码及运算 A [1 0 3;…...
<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色
前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本篇构建了这样的一个实例,可以动态修改UI的主题,通过菜单栏来选择预设的自定义主题和官方主题&#…...
k8s——安全机制
一、安全机制说明 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介, 也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。 比如 kubectl 如果想…...
Linux驱动应用编程(三)UART串口
本文目录 前述一、手册查看二、命令行调试串口1. 查看设备节点2. 使用stty命令设置串口3. 查看串口配置信息4. 调试串口 三、代码编写1. 常用API2. 例程线程优化 前述 在开始实验前,请一定要检查测试好所需硬件是否使用正常,不然调试过程中出现的问题&am…...
【设计模式深度剖析】【4】【行为型】【策略模式】
文章目录 策略模式定义英文原话直译 角色类图策略接口Strategy:具体策略类上下文类Context测试类 策略模式的应用策略模式的优点策略模式的缺点策略模式的使用场景 策略模式 策略模式(Strategy Pattern) Strategy策略也称作Policy政策。 想…...
opencv dnn模块 示例(26) 目标检测 object_detection 之 yolov10
文章目录 1、yolov10简要介绍1.1、双标签分配策略1.2、架构改进1.3、性能1.4、预训练模型1.5、网络有关层说明 2、测试2.1、官方测试2.2、opencv dnn2.2.1、仅运行到内部"NMS"步骤之前的层2.2.2、完整代码2.2.2、完整实现所有层 2.3、onnxruntime测试2.4、tensorrt 1…...
【python进阶】python图形化编程之美--tkinter模块初探
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
discuz点微同城源码34.7+全套插件+小程序前端
discuz点微同城源码34.7全套插件小程序前后端 模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序...
ActiveMQ 介绍、下载、安装和控制台
ActiveMQ 介绍 Apache ActiveMQ 是一款非常成熟且功能全面的开源消息中间件,由Apache软件基金会维护。它遵循 Java Message Service (JMS) 规范,这意味着它提供了一组标准的 API,允许 Java 应用程序以一种标准化的方式发送和接收消息。 以下…...
MacOS M系列芯片一键配置多个不同版本的JDK
第一步:下载JDK。 官网下载地址:Java Archive | Oracle 选择自己想要下载的版本,一般来说下载一个jdk8和一个jdk11就够用了。 M系列芯片选择这两个,第一个是压缩包,第二个是dmg可以安装的。 第二步:编辑…...
源码文章上传无忧,论坛小程序支持
前言 在数字化时代,知识的分享与传播显得愈发重要。为了满足广大创作者和求知者的需求,我们推出了全新的论坛小程序,不仅支持文章、源码、链接等多样化内容的上传,还实现了付费观看功能,为创作者们提供了一个展示才华…...
Docker面试整理-如何优化Docker容器的性能?
优化Docker容器的性能可以从多个方面入手,以下是一些建议: 选择合适的基础镜像:使用轻量级的基础镜像,如基于Alpine Linux的镜像,可以减少镜像的大小和启动时间。避免使用过于庞大的操作系统镜像。优化Dockerfile:减少Dockerfile中的不必要指令和层,以最小化镜像的大小。…...
list(二)和_stack_queue
嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(二)以及_stack_queue,下面让我们开始今天的学习吧! list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…...
查询SQL02:寻找用户推荐人
问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析: 这题主要是要看这null值会不会用,如果说Java玩多了,你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…...
2、Tomcat 线程模型详解
2、Tomcat 线程模型详解 Tomcat I/O模型详解Linux I/O模型详解I/O要解决什么问题Linux的I/O模型分类 Tomcat支持的 I/O 模型Tomcat I/O 模型如何选型 网络编程模型Reactor线程模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 Tomcat NIO实现Tomcat 异步IO实现 Tomc…...
对硬盘的设想:纸存、执行存
固态硬盘出现后,发现它的擦写次数受限,越是便宜的固态硬盘,擦写次数越少。于是,有了“纸存”的设想,即硬盘上的单元只能改写一次,就像拿钢笔在纸上写字一样。这时,文件系统、数据库该怎么设计&a…...
最新付会进群多群同时变现社群系统V3.5.3版本 详细教程+源码下载
市面1888最新付费进群多群同时变现系统V3.5.3版本 详细教程源码下载介绍: 续男粉变现,相亲群变现后 演化出来的最新多群同时变现系统 可同时进行40个群同时变现 可设置地域群,相亲,男粉变现等多种群 购买后包括详细的 域名服…...
python tk实现标签切换页面
import tkinter as tk from tkinter import ttk# 初始化主窗口 root tk.Tk() root.title("标签页示例")# 设置窗口大小 root.geometry("400x300")# 创建 Notebook 小部件 notebook ttk.Notebook(root) notebook.pack(expandTrue, fill"both")#…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
