[每日习题]动态规划——公共子串计算 通配符匹配——牛客习题

news2024/11/15 12:00:31

        hello,大家好,这里是bang___bang_,本篇记录2道牛客习题,公共子串计算(中等),通配符匹配(较难),如有需要,希望能有所帮助!

目录

1️⃣公共子串计算

2️⃣通配符匹配


1️⃣公共子串计算

公共子串计算_牛客题霸_牛客网 (nowcoder.com)

描述

给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。

注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。

数据范围:字符串长度:1≤s≤150 

进阶:时间复杂度:O(n^3) ,空间复杂度:O(n) 

输入描述:

输入两个只包含小写字母的字符串 

输出描述:

输出一个整数,代表最大公共子串的长度 

示例1:

输入:  asdfas

          werasdfaswer

返回值:6

解题思路:

        1.计算最大公共子串的长度,需要形成第i-1位置的子串长度提供给第i位置的子串。故采用动态规划。dp[ i ] [ j ]表示 s[ i ] 与 p[ i ] 构成子串的长度

        2.子串长度是在前面求得的子串的长度下再+1。递推公式:dp[ i ] [ j ] = dp[ i-1 ] [ j-1 ] + 1

        3.在两待匹配字符串前添加一个空串,方便我们从两个待匹配字符串首字符开始遍历。遍历从下标1开始,即从待匹配字符串的首字符,并且防止 i-1 和 j-1 越界,默认初始化值为0,相当于空串并不加入计算,只是为了方便我们去匹配。

        4.使用局部变量maxlen,在每次匹配为子串时进行比较更新为最大长度。

代码实现:

#include <iostream>
#include<string>
#include<cmath>
#include<vector>
using namespace std;

int GetMaxLength(string s,string p)
{
    int maxlen=0;//记录最大公共字串长度
    s=" "+s;//添加空串
    p=" "+p;//添加空串
    int n=s.size();
    int m=p.size();
    vector<vector<int>>dp(n,vector<int>(m));//初始化为0,不影响计算长度
    //i=1,j=1;从待匹配字符串开始匹配(原字符串)
    for(int i=1;i<n;i++)
    {
        for(int j=1;j<m;j++)
        {
            if(s[i]==p[j])//匹配为子串
            {
                dp[i][j]=1+dp[i-1][j-1];    //获取长度
                maxlen=max(maxlen,dp[i][j]);//更新最大长度
            }
        }
    }
    return maxlen;
}

int main() {
    string str1,str2;
    while(cin>>str1>>str2)
    {
        cout<<GetMaxLength(str1,str2)<<endl;
    }    
    return 0;
}

2️⃣通配符匹配

通配符匹配_牛客题霸_牛客网 (nowcoder.com)

描述

请实现支持'?'and'*'.的通配符模式匹配

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

返回两个字符串是否匹配

函数声明为:

bool isMatch(string s,string p)

下面给出一些样例:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "d*a*b") → false

数据范围:字符串长度满足 0≤n≤1000

进阶:空间复杂度 O(1),时间复杂度 O(n)

示例1:

输入:"ab","?*"

返回值:true

示例2:

输入:"ab","*"

返回值:true

解题思路: s为待匹配字符串,p为含通配符字符串

        1.通配符匹配,前一个位置匹配的结果要给后一个位置进行判断是否匹配,故采用动态规划。

dp[ i ] [ j ] 表示s[ i ] 和 p [ j ]匹配情况

        2.根据规则可以将匹配情况划分为2种:

                【1】p [ j ] = * ,*号可以匹配0至多个。

                【2】p [ j ] != * ,也就是说是相同字符或者是?号,?号相当于万能符,必定和待匹配字符串匹配,效果相当于相同字符匹配。

        3.推导递推公式:

      【1】当p [ j ] = * ;去掉 * 号匹配的字符,看*前匹配的结果。j-1 去掉*号,i-num 去掉 * 号匹配的字符。

步骤一: 如果 * 号匹配0个,dp[ i ] [ j ] = dp[ i ] [ j-1 ] 

               如果 * 号匹配1个,dp[ i ] [ j ] = dp[ i-1 ] [ j-1 ] 

               如果 * 号匹配2个,dp[ i ] [ j ] = dp[ i-2 ] [ j-1 ] 

               如果 * 号匹配.....

步骤二:* 号可以匹配0至n个字符,也就是说上述情况都有可能发生,也就是采用并集。

               即dp[ i ] [ j ] = dp[ i ] [ j-1 ] || dp[ i-1 ] [ j-1 ] || dp[ i-2 ] [ j-1 ] || ..........1️⃣

步骤三:将 i = i-1 1️⃣

               得到 dp[ i-1 ] [ j ] = dp[ i-1 ] [ j-1 ] || dp[ i-2 ] [ j-1 ] || dp[ i-3 ] [ j-1 ] || .......... 2️⃣

步骤四:发现2️⃣与1️⃣后部分一致,进行替换。

                得到最终递推公式:当p [ j ] == * ;dp[ i ] [ j ] = dp[ i ] [ j-1 ] || dp[ i-1 ] [ j ]

        【2】当p [ j ] != *;dp[ i ] [ j ] = dp[ i-1 ] [ j-1 ] && (s[ i ] == p [ j ] || p[ j ] == '?' )前一个字符的匹配结果与当前匹配是否为相同字符或者通配符?共同决定当前位置的匹配结果。

        4.添加空串,空串必定匹配设置为true;原s串待匹配串,不可能和添加的空串匹配,默认为false;如果原p串首字符为*有可能和添加的空串匹配,所以要从[0][1]开始匹配。

*a
TTFF
aF
bF
aF

代码实现:

class Solution {
  public:
    bool isMatch(string s, string p) {
        //添加空串
        s = " " + s;
        p = " " + p;
        int n = s.size();
        int m = p.size();
        vector<vector<bool>>dp(n, vector<bool>(m));//默认初始化为false
        dp[0][0] = true;//空串必定匹配设置true
        //原s串待匹配串,不可能和添加的空串匹配,i!=1,[i][0]默认为false
        for (int i = 0; i < n; i++) 
        {
            //如果原p串首字符为*有可能和添加的空串匹配,所以要从[0][1]开始匹配
            for (int j = 1; j < m; j++) 
            {
                if (p[j] != '*') {
                    //i&&j防止越界
                    dp[i][j] = i && j && dp[i - 1][j - 1] && (s[i] == p[j] || p[j] == '?');
                } else {
                    //i&&和j&&防止越界
                    dp[i][j] = (i && dp[i - 1][j]) || (j && dp[i][j - 1]);
                }

            }
        }
        return dp[n - 1][m - 1];
    }
};

文末结语,本篇记录了2道动态规划的牛客习题,1道中等题(公共子串计算);1道较难题(通配符匹配),包含递推公式的推导,本文旨在记录,如有需要,希望能有所帮助!!

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

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

相关文章

AI实战干货,用AI 5分钟做1本超清画质原创绘本

Hi~我是专注于AI技术教程和项目实战的赤辰。 上期给大家分享了用ChatGPT生产配音的方法教程&#xff0c;反馈还是很热烈的&#xff0c;今天给大家带来一个用ChatGPT 5分钟生产出高画质精品绘本的教程。目前就有朋友通过这个插件制作育儿绘本教材&#xff0c;然后在亚马逊和小红…

UE4 网格体闪烁问题解决

情形1 模型摆放共面导致闪烁 解决&#xff1a;模型的表面重叠引起的闪烁&#xff0c;将模型间距隔开1-2cm&#xff0c;视觉效果基本看不出来&#xff0c;但是能够很好解决表面山数艘问题。 情形2 模型建模时相接部分共面导致闪烁 解决&#xff1a;模型建模时不同组件使用过不…

用于紫外线消毒灯的LED驱动:数明深紫外消毒方案SLM201

用于紫外线消毒灯的LED驱动SLM201 应用于紫外线消毒灯的LED驱动。疫情过后让越来越多的人开始注重起个人健康&#xff0c;除了出门佩戴口罩外&#xff0c;对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外&#xff0c;利用紫外线灯给衣物表面、房间消毒也…

计算球体上一点指向球心的姿态

背景&#xff1a;最近有个需求&#xff0c;需要用相机拍摄一个物品&#xff0c;初始状态下相机在该物体正上方&#xff0c;随后相机的坐标按一定规律变化&#xff0c;要求它的视野中心一直固定在该物体上。这个问题可以理解为&#xff1a;以物品建立一个坐标系&#xff0c;相机…

C++ 类和对象篇(三) 空类和默认成员函数

目录 一、空类 二、6个默认成员函数 一、空类 1.是什么&#xff1f; 如果一个类中没有显示定义任何成员&#xff0c;简称为空类。 class A {};//一个空类 2.空类中的成员&#xff1f; 空类中真的什么都没有吗&#xff1f; 并不是&#xff0c;任何类在什么都不写时&#xff0c…

quickping探查在线设备的缺陷

在单位工作的一部分是网络维护&#xff0c;发现在单位淘汰win7后&#xff0c;大量win10&#xff0c;win11设备使用后&#xff0c;探查在线设备用的quickping越来越不靠谱&#xff0c;发现有时使用后探查后&#xff0c;没有使用的ip&#xff0c;配置后会出现ip冲突&#xff0c;决…

[Pytorch]卷积运算conv2d

文章目录 [Pytorch]卷积运算conv2d一.F.Conv2d二.nn.Conv2d三.nn.Conv2d的运算过程 [Pytorch]卷积运算conv2d 一.F.Conv2d torch.nn.functional.Conv2d()的详细参数&#xff1a; conv2d(input: Tensor, weight: Tensor, bias: Optional[Tensor]None, stride: Union[_int, _s…

Apache RocketMQ 远程代码执行漏洞(CVE-2023-33246)

漏洞简介 RocketMQ 5.1.0及以下版本&#xff0c;在一定条件下&#xff0c;存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露&#xff0c;缺乏权限验证&#xff0c;攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命…

BAPI_GOODSMVT_CREATE 更改凭证的创建人

凭证创建时(创建人)需要更改为其它人员 1. 复制BAPI_TE_XMKPF, 增加字段USNAM 2. SE18: BADI名称 - MB_BAPI_GOODSMVT_CREATE 创建badi实施 3. 增强代码编辑如下: method if_ex_mb_bapi_goodsmvt_create~extensionin_to_matdoc.data: lt_extension type standard table …

力扣320. 列举单词的全部缩写

单词的 广义缩写词 可以通过下述步骤构造&#xff1a;先取任意数量的 不重叠、不相邻 的子字符串&#xff0c;再用它们各自的长度进行替换。 例如&#xff0c;“abcde” 可以缩写为&#xff1a; “a3e”&#xff08;“bcd” 变为 “3” &#xff09; “1bcd1”&#xff08;“a…

Linux第六章之vim与gcc使用

一、Linux编辑器-vim使用 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也…

【数据分享】1999—2021年地级市各类交通工具的客货运量和拥有量数据(Shp/Excel格式)

1999-2021年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、地方一般公共预算收支状况、工业企业数、固定资产投资和对外经济贸易数据、科技创新指标数据、劳动力就业及…

软考中级信息安全工程师2023下半年报名时间及报名入口官网

软考中级信息安全工程师2023下半年考试时间&#xff1a; 2023年下半年软考中级信息安全工程师的考试时间为11月4日、5日。考试时间在全国各地一致&#xff0c;建议考生提前备考。共分两科&#xff0c;第一科基础知识考试具体时间为9:00-11:30&#xff1b;第二科应用技术考试具…

【Android Framework系列】第9章 AMS之Hook实现登录页跳转

1 前言 前面章节我们学习了【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcher启动流程&#xff0c;大概了解了AMS的原理及启动流程&#xff0c;这一章节我们通过反射和动态代理对不同Android版本下的AMS进行Hook&#xff0c;实现…

Ansible —— playbook 剧本

Ansible —— playbook 剧本 一、playbook的概述1.playbook简介2.什么是Ansible playbook剧本&#xff1f;3.Ansible playbook剧本的特点4.如何使用Ansible playbook剧本&#xff1f;5.playbooks 本身由以下各部分组成 二、playbook示例1.运行playbook2.定义、引用变量3.指定远…

低代码PAAS平台源码,采用对象式和勾选式实现企业应用程序开发

管理后台低代码PaaS平台是一款基于 Salesforce Platform 的开源替代方案&#xff0c;旨在为企业提供高效、灵活、易于使用的低代码开发平台。低代码PaaS平台的10大核心引擎功能&#xff1a;1.建模引擎 2.移动引擎 3.流程引擎 4.页面引擎 5.报表引擎 6.安全引擎 7.API引擎 8.应用…

C++多线程环境下的单例类对象创建

使用C无锁编程实现多线程下的单例模式 贺志国 2023.8.1 一、尺寸较小的类单例对象创建 如果待创建的单例类SingletonForMultithread内包含的成员变量较少&#xff0c;整个类占用的内存空间较小&#xff0c;则可以使用如下方法来创建单例对象&#xff08;如果类的尺寸较大则不…

【Linux命令200例】用rcp复制远程文件到本地

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

再添新证书!数据库云管平台 zCloud 与 OceanBase 完成产品兼容互认证

近日&#xff0c;云和恩墨 zCloud 数据库云管平台&#xff08;简称&#xff1a;zCloud&#xff09;与北京奥星贝斯科技有限公司&#xff08;简称&#xff1a;OceanBase&#xff09;完成产品兼容性互认证。本次测试结果表明&#xff1a;zCloud 具备对 OceanBase 的纳管、监控告警…

工业机器视觉系统开发流程简介

工业机器视觉系统的开发过程主要包括以下几个阶段&#xff1a; 需求分析和系统设计&#xff1a;与用户合作&#xff0c;明确系统的功能和性能需求&#xff0c;并设计系统的整体架构。 软、硬件选型&#xff1a;根据需求分析结果&#xff0c;选择适合的软、硬件设备&#xff0…