C++--两个数组的dp问题(2)

1.交错字符串  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定三个字符串 s1s2s3,请判断 s3 能不能由 s1 和 s2 交织(交错) 组成。

两个字符串 st 交织 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

  • s = s1 + s2 + ... + sn
  • t = t1 + t2 + ... + tm
  • |n - m| <= 1
  • 交织s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

提示:a + b 意味着字符串 ab 连接。

示例 1:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true

示例 2:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false

示例 3:

输入:s1 = "", s2 = "", s3 = ""
输出:true
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {int n=s1.size();int m=s2.size();if(m+n!=s3.size())return false;s1=" "+s1;s2=" "+s2;s3=" "+s3;//初始化vector<vector<bool>> dp(n+1,vector<bool>(m+1));dp[0][0]=true;for(int j=1;j<=m;j++){if(s2[j]==s3[j])dp[0][j]=true;else break;}for(int i=1;i<=n;i++){if(s1[i]==s3[i])dp[i][0]=true;else break;}//状态转移方程for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){//两种方法都可/*if(s1[i]==s3[i+j]&&dp[i-1][j]){dp[i][j]=true;}else if(s2[j]==s3[i+j]&&dp[i][j-1]){dp[i][j]=true;}*/dp[i][j]=((dp[i-1][j]&&s1[i]==s3[i+j])||(dp[i][j-1]&&s2[j]==s3[i+j]));}}return dp[n][m];}
};

2.两个字符串的最小ASCII删除和 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定两个字符串s1 和 s2,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 

示例 1:

输入: s1 = "sea", s2 = "eat"
输出: 231
解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。
在 "eat" 中删除 "t" 并将 116 加入总和。
结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。

示例 2:

输入: s1 = "delete", s2 = "leet"
输出: 403
解释: 在 "delete" 中删除 "dee" 字符串变成 "let",
将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。
如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。

分析:

class Solution {
public: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-1][j],dp[i][j-1]);if(s1[i-1]==s2[j-1]){dp[i][j]=max(dp[i][j],dp[i-1][j-1]+s1[i-1]);}}}int sum1=0;int sum2=0;for(auto sh1:s1) sum1+=sh1;for(auto sh2:s2) sum2+=sh2;return sum1+sum2-dp[n][m]*2;}
};

3.最长重复子数组  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 

示例 1:

输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。

示例 2:

输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5
class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int n=nums1.size();int 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;}else{dp[i][j]=0;}ret=max(ret,dp[i][j]);}}return ret;}
};

4.正则表达式匹配  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

 

示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3:

输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
lass Solution {
public:bool isMatch(string s, string p) {int n=s.size();int m=p.size();vector<vector<bool>> dp(n+1,vector<bool>(m+1));s=" "+s;p=" "+p;dp[0][0]=true;//初始化for(int i=2;i<=m;i+=2){if(p[i]=='*')dp[0][i]=true;else break;}for(int i=1;i<=n;i++){//状态转移方程for(int j=1;j<=m;j++){if(s[i]==p[j]&&dp[i-1][j-1])dp[i][j]=true;else if(p[j]=='.'&&dp[i-1][j-1])dp[i][j]=true;else if(p[j]=='*'){dp[i][j]=dp[i][j-2] || (p[j-1]=='.'||s[i]==p[j-1]) && dp[i-1][j];}}}return dp[n][m];//返回值}
};

5.通配符匹配  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?''*' 匹配规则的通配符匹配:

  • '?' 可以匹配任何单个字符。
  • '*' 可以匹配任意字符序列(包括空字符序列)。

判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

 

示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa", p = "*"
输出:true
解释:'*' 可以匹配任意字符串。

示例 3:

输入:s = "cb", p = "?a"
输出:false
解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
class Solution {
public:bool isMatch(string s, string p) {int n=s.size();int m=p.size();vector<vector<bool>> dp(n+1,vector<bool>(m+1));dp[0][0]=true;for(int i=1;i<=m;i++){if(p[i-1]=='*')dp[0][i]=true;else break;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(p[j-1]=='*'){dp[i][j]=dp[i-1][j]||dp[i][j-1];}else{if(s[i-1]==p[j-1]&&dp[i-1][j-1])dp[i][j]=true;else if(p[j-1]=='?'&&dp[i-1][j-1])dp[i][j]=true;}}}return dp[n][m];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python序列类型

序列&#xff08;Sequence&#xff09;是有顺序的数据列&#xff0c;Python 有三种基本序列类型&#xff1a;list, tuple 和 range 对象&#xff0c;序列&#xff08;Sequence&#xff09;是有顺序的数据列&#xff0c;二进制数据&#xff08;bytes&#xff09; 和 文本字符串&…

ubuntu 16.04 命令行测网速 简单快速

我们在终端直接输入 speedtest-cli 会提示 The program speedtest-cli is currently not installed. You can install it by typing: sudo apt install speedtest-cli这已经提示了我们应该怎么做&#xff1a; $ sudo apt install speedtest-cli安装完成后 输入 speedtest…

20190228-ubuntu测网速-speedtest-cli

ubuntu 测速 https://blog.csdn.net/xdhyqd/article/details/112917302 ubuntu 网速测试方法 https://www.machunjie.com/linux/718.html Ubuntu/Centos服务器测网速方法|怎样测试服务器的上传下载网速&#xff1f; https://www.cnblogs.com/sawyer22/p/9985567.html Ubuntu1…

JavaScript中的事件循环(Event Loop)

1. 概述 javaScript是单线程的&#xff0c;意味着它一次只能执行一个任务。然而&#xff0c;许多操作&#xff0c;如网络请求、定时器等&#xff0c;都会导致延迟&#xff0c;如果程序在等待这些操作完成时&#xff0c;可能会操作一个阻塞的效果&#xff0c;影响用户体验。这个…

《C语言编程环境搭建》工欲善其事 必先利其器

C语言编译器 GCC 系列 GNU编译器套装(英语&#xff1a;GNU Compiler Collection&#xff0c;缩写为GCC)&#xff0c;指一套编程语言编译器&#xff0c;常被认为是跨平台编译器的事实标准。原名是&#xff1a;GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 &#xff0c…

MDK 5.xx.0 + STM32F10x 笔记

天才脑袋比不上烂笔头, 写给自己看, 自用资料。 安装MDK STM32环境 Download MDK安装 MDK -> c:\keil_v5 用默认路径下载 ARMCC V5.06 Update 7 (build960) <- 长期稳定支持版本安装至 c:\keil_v5\arm\ARMCC开启 uVision.设定 预设编译程序版本 : V5.06 Update 7 (bui…

Sloare flare网卡信息

详细的安装信息 https://github.com/Xilinx-CNS/onload/tree/master/scripts 进行下载 Solarflare网卡开发:openonload 安装与调试_openonload安装_Erice_s的博客-CSDN博客 cns-sfnettest测试 cns-sfnettest 下载

战斗场景之英雄的AI

*我代码风格有点不好&#xff0c;能公有坚决不私有&#xff0c;但是这个不好&#xff0c;因为这个被老大训了好几次呢&#xff0c;后来看到朋友们看我的代码都一副蒙的样子&#xff0c;我还是改了&#xff0c; 下面的代码我还没改&#xff0c;因为是自己随手做的小东西&#x…

2023年最新版IDEA安装(超详细)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【JavaSE_primary】 写在前面&#xff0c;IDEA的安装是建立在JDK安装好了的前提下&#xff0c;否则IDEA是无法使用的&#xff0c;具体JDK…

【Unity】【UI Shader】关于用Shader实现字体的描边和阴影

前言 描边和阴影&#xff0c;Unity本来是由自带的组件的&#xff08;Outline和Shadow&#xff09;。Unity自己的实现方式如下&#xff1a; Outline&#xff1a;把原文字/图片以往的网格复制4份&#xff0c;然后上下左右各偏移一点距离&#xff08;相当于多绘制了4遍&#xff…

【Android】MyTool 工具界面:手电筒

文章目录 MyTool 工具界面&#xff1a;♦ 回顾♦ 设置 activity_my_tool.xml 界面♦ 编写 MyToolActivity 实现功能界面跳转♦ 创建 activity_flash_light.xml 手电筒界面♦ 编写 FlashLightActivity 实现功能♦ 修改AndroidManifest.xml文件授权♦ 测试 MyTool 工具界面&#…

定时器中断学习和简单应用

定时器中断&简单应用 定时器中断基本介绍清楚明白工作原理定时器结构 主要内容两个寄存器初始化程序 简单应用-秒表基本功能代码详解 彩蛋&#xff1a;对于独立按键的使用没啥硬核内容&#xff0c;就是初学者萌新入门&#xff0c;学长大佬请移步 定时器中断 基本介绍 清…

自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息

除了地图数据&#xff0c;秒表应用还有一些其他希望保存的数据&#xff0c;例如上次定位的位置&#xff0c;地图画面的缩放比例等。本文介绍通过对象关系映射数据库技术保存这些信息的方法。 通用的设定信息表 下面的代码定义了用于保存设定信息的通用的表结构&#xff1a; E…

Git企业开发控制理论和实操-从入门到深入(七)|企业级开发模型

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

模2运算规则

模2加法 模2加法没有进位&#xff0c;等同于异或运算。一位数的模2加法规则如下&#xff1a; 0 0 0 0 1 1 1 0 1 1 1 0 多位数的模2加法中&#xff0c;每一位都按照上面的规则进行&#xff0c;例如: 当多个数相加&#xff0c;对应位置上如果有偶数个1&#xff0c;…

知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现,本篇文章,我将指导大家如何使用py2neo和Neo4j构建一个实用的超市商品知识图谱和推荐系统。该系统可以帮助用户快速找到感兴趣的商品,并提供个性化的推荐服务…

pygame实现物体运动拖尾尾迹

文章目录 前言主要内容讲解&#xff1a;代码 总结更多宝藏 前言 &#x1f60e;&#x1f973;&#x1f60e;&#x1f920;&#x1f916;&#x1f648;&#x1f4ad;&#x1f373;&#x1f371; 本文我们来讲一下如何使用pygame实现一个拖尾特效。 主要内容 &#x1f99e;&am…

pe_xscan 增加 O31 项

O31项 对应的项目&#xff1a; 开机、关机脚本 用户登录、注销脚本

LeetCode第1~5题解

CONTENTS LeetCode 1. 两数之和LeetCode 2. 两数相加LeetCode 3. 无重复字符的最长子串 LeetCode 1. 两数之和 【题目描述】 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。…

linux下运行win10效果好不好,Win10不好用?继续坚守Win7的人依然巨多

前不久&#xff0c;微软发布消息称Windows 10操作系统市场占有率终于突破50%。而近日&#xff0c;安全厂商卡巴斯基发布的8月下旬最新研究报告也印证了这一点&#xff0c;并且从数据来看&#xff0c;Windows 10系统的占有率还有小幅度的增长&#xff0c;达到了53%左右。 退休时…