[leetcode.10]正则表达式匹配

news2024/11/15 19:47:10

(1)题目分析如下 

题目要求完成一个正则表达式的匹配,其中s为目标串,p为正则串

.符号代表任何字符,*符号代表把前一个字符重复n次(可能为0次

(2)具体思路

一开始的时候想过贪心算法,但是贪心算法无法匹配这种aaa--a*a,所以这题我们只能采用动态规划的模式:(或者递归)

建立二维数组int arr[i][j],代表s字符串的前i个和p字符串的前j个能否进行匹配

1.如果p[j]

目前指向的不是*符号,那么就代表当前是一一字符进行比较的,如果是s[i]==p[j],那么就arr[i][j]的值就由上一个情况决定,即arr[i][j]=arr[i-1][j-1]........

如果ij对应的字符不是匹配的,那么就认为arr[i][j]=0

2.如果p[i]='*'

如果s[i]==p[i-1],相当于s[i]末尾可能是多个复制的结果,所以可能为arr[i][j]=arr[i-1][j];

但是这这种情况,比如aab和aaa*b,这种情况下【2】和【4-1】确实能匹配上,但是【2】【2】已经完成了匹配,这种情况下其实就是虽然能对上,但本质上还是复制了零次,所以也可能为arr[i][j]=arr[i][j-2]

但是如果不相等就没辙了,真的就代表复制了0次,arr[i][j]=arr[i][j-2]

上述过程抽象一下应该就是回归方程了

另外,二维数组从1开始,说明我们要对二维数组两个0有关的列,当时 j为0(对应p串为空),arr[i][j]=0;

当i=0(s串为空),此时p串如果j为星号,可能是复制了0次,arr[0][j]=arr[0][j-2] ,如果j不是*,那就妥妥的匹配不上,arr[i][j]=0;

最后补充初始情况,arr【0】【0】=1;

具体代码实现如下

(注意这里把字符串延长匹配了一下)

bool isMatch(string s, string p) {
    s=" "+s;
    p=" "+p;
    //上面是为了配合动态规划,认为加长一下,动态规划一般不都是默认从1开始,然后边界情况单独初始化吗
    //这道题中的边界情况就是
    int arr[31][31];
    for(int i=0;i<=s.length()-1;i++)
        for(int j=0;j<=p.length()-1;j++)
            if(i==0||j==0)
                arr[i][j]=0;
    arr [0][0]=1;
    for(int j=1;j<=p.length()-1;j++) {
        if (p[j] == '*') {
            arr[0][j] = arr[0][j - 2];
        } else {
            arr[0][j] = 0;
        }
    }
    //初始化数组完成
    for(int i=1;i<=s.length()-1;i++){
        for(int j=1;j<=p.length()-1;j++){
            if(p[j]!='*'){
                if(s[i]==p[j]||p[j]=='.'){
                    arr[i][j]=arr[i-1][j-1];
                }else{
                    arr[i][j]=0;
                }
            }else{
                if(s[i]==p[j-1]||p[j-1]=='.'){
                    arr[i][j]=(arr[i-1][j] || arr[i][j-2]);
                }else{
                    arr[i][j]=arr[i][j-2];
                }
            }
        }
    }
    for(int i=0;i<=s.length()-1;i++) {
        for (int j = 0; j <= p.length() - 1; j++) {
            cout<<arr[j][i];
        }
        cout<<endl;
    }
    return arr[s.length()-1][p.length()-1];
}

 

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

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

相关文章

c++算法基础必刷题目——贪心

文章目录贪心1、拼数2、排座椅3、矩阵消除游戏4、华华听月月唱歌贪心 贪心算法&#xff08;greedy algorithm &#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&a…

《图解TCP/IP》阅读笔记(第八章 8.5)—— WWW知多少?

8.5 WWW 看到这章的名字&#xff0c;对于日常上网冲浪的我们而言&#xff0c;应该是再熟悉不过了。这不就是常见网址前的那三个字母&#xff0c;号称万维网&#xff08;WWW&#xff0c;World Wide Web&#xff09;的东西吗? 确实&#xff0c;我们本篇文章就要介绍与之相关的…

Dimitra 2022: 年度回顾

大家好&#xff0c; 我首先要感谢 Dimitra 社区和我们所有的投资者在 2022 年期间的支持。俗话说&#xff0c;“这些都会过去”&#xff0c;2022 年的宏观加密环境尤其具有挑战性&#xff0c;一些非常糟糕的行为者给广泛的加密行业带来很多痛苦。 2023 年可能是监管框架最终显…

公司来了个新测试开发,一副毛头小子的样儿,哪想到......

最近公司来了个新同事&#xff0c;学历并不高&#xff0c;而且大学也不是计算机专业的&#xff0c;今年刚满25岁。。 本以为也是来干点基础的活混混日子的&#xff0c;结果没想到这个人上来就把现有项目的性能优化了一遍&#xff0c;直接给公司节省了不少成本&#xff0c;这种…

Qt通过QProcess启动进程并传递命令行参数

目录QProcess启动外部程序的两种方式依赖式分离式&#xff1a;启动进程前的预处理设置启动路径设置启动命令参数启动的状态更多说明Public FunctionsSignals设计一个拉起进程的程序基本设计思路效果图核心代码控件对象header file&#xff08;头文件&#xff09;member variabl…

java比较器

一、说明: Java中的对象&#xff0c;正常情况下&#xff0c;只能进行比较: 或 ! 。不能使用 >或 如何实现? 使用两个接口中的任何一个: Comparable 或 Comparator 二、Comparable的使用(自然排序) 1.Comparable接口的使用举例: 1.像string、包装类等实现了Comparable接口…

智能优化算法:协作搜索算法-附代码

智能优化算法&#xff1a;协作搜索算法 摘要&#xff1a;协作搜索算法( Cooperation search algorithm &#xff0c;CSA)是 Zhong-kai Feng等 于 2021 年提出的一种新型元启发式优化算法 。 该算法受现代企业团队协作行为的启发&#xff0c;具有寻优能力强&#xff0c;收敛速度…

Seata-AT模式数据源代理-JDBC中的关键知识点

背景 Seata 对业务无侵入是通过数据源代理实现的&#xff0c;从下图中可看出&#xff0c;数据源代理的实现涉及到 DataSource、Connection 以及 Statement&#xff0c;这几个关键知识属于 JDBC 的范畴&#xff0c;所以本篇从 JDBC 的视角对他们进行介绍。 一、JDBC 概述 JDBC…

【算法】面试题 - 回溯算法解题套路框架

回溯算法解题套路框架前言回溯算法的框架排列&#xff08;元素无重不可复选&#xff09;46. 全排列解析子集&#xff08;元素无重不可复选&#xff09;78. 子集解析组合&#xff08;元素无重不可复选&#xff09;77. 组合解析子集/组合&#xff08;元素可重不可复选&#xff09…

免费PDF转Word?有这几个网站就够了

如果您想使用 Word 文档&#xff0c;您可能需要将PDF 转换为 Word&#xff0c;以便您可以随意使用该文档。将 PDF 转换为 Word 的过程需要一个好的 PDF 转换器。在本文中&#xff0c;您将探索可用的 5个免费转换器&#xff0c;其中包括 奇客PDF 和PDF2Go。 最好的 6 个 PDF 转 …

【unity笔记】图解Vector3.SignedAngle()方法的返回值

首先看一下官方文档的说明&#xff1a; public static float SignedAngle (Vector3 from, Vector3 to, Vector3 axis); from测量角度差的源向量。to测量角度差的目标向量。axis一个向量&#xff0c;其他向量将绕其旋转。返回 from 与 to 之间的有符号角度&#xff08;以度为单…

CodeQL 源代码漏洞扫描

目录 1、下载配置 codeql 1.1 配置 codeql 1.2 配置 maven 2、测试 codeql 漏洞检测 2.1 构建 codeql 查询数据库 2.2 漏洞检测 测试环境&#xff1a;centos7 jdk11 maven 1、下载配置 codeql 1.1 配置 codeql 下载安装 codeql-cli: https://github.com/github/code…

大数据系列——什么是Flink?Flink有什么用途?

目录 一、基本概念 批与流 数据可以作为无界流或有界流处理 二、什么是Flink&#xff1f; 三、Flink有什么用途&#xff1f; 四、适用场景 五、flink事件驱动 六、flink拥有分层API flink sql 七、fllink企业级使用 一、基本概念 批与流 批处理的特点是有界、持久、大…

被误认为是外国人开发的4款软件,功能强大到离谱,且用且珍惜

国外的月亮不一定比国内圆&#xff0c;随着国内互联网飞速发展&#xff0c;国内研发出许多实用又良心的软件&#xff0c;由于偏见&#xff0c;功能强大的它们却被误认为是外国佬研发的。 1、Foxit PDF用系统自带的Adobe实在难用&#xff0c;Foxit这款PDF阅读器实在太强大&#…

unity使用RenderTexture可以渲染粒子特效

一&#xff0c;使用UIRawImage,创建材质球&#xff0c;把Shader给材质球&#xff0c;放到RawImage的Material上&#xff0c; // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shader "UI/Default No-Alpha" {Properties{[PerRende…

基于文本和图像的网络舆情分析方法研究

基于文本和图像的网络舆情分析方法研究 一、舆情分析技术 &#xff08;1&#xff09;舆情数据采集与提取技术&#xff1b; &#xff08;2&#xff09;自动文摘技术&#xff1b; &#xff08;3&#xff09;事件发现与追踪技术&#xff1b; &#xff08;4&#xff09;舆情情感分…

【虚幻引擎UE】UE5 模型描边的三个方法

一、后期处理法 1、创建描边材质&#xff0c;方法很多种&#xff0c;主要有设置深度、法线描边等 可以参考现有文章制作或直接下载材质资源使用。 参考文章&#xff1a; 1、【UE4】几种后处理描边的方法&#xff0c;效果及效率 2、UE4之物体描边 3、【UE4_001】后期处理轮廓…

第002课 - 项目整体效果展示

文章目录 基础篇高级篇流量控制:alibaba sentinel注册中心链路追踪高可用集群篇CICD这个章节是进行项目效果的演示。 基础篇 第一个就是基础篇。 这是我们的后台管理系统。 围绕电商的管理系统做一个整套的增删改查逻辑。 这个商品系统都会教给大家来编写的。 这个是使用前…

网站报错:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted的处理方法

原因分析 内存已耗尽&#xff0c;这关系到PHP的memory_limit的设置问题&#xff0c;根据自己的需要及参考本机的内存大小修改php内存限制。 解决方案 1、修改php.ini &#xff08;改配置&#xff09; memory_limit 128 这种方法需要重启服务器&#xff0c;很显然&#xff0c…

向Linux内核添加驱动的步骤详解

1、获取驱动源码 (1)驱动源码一般都是从设备厂商处获取&#xff1b; (2)设备厂商给的驱动源码大体上是没有问题的&#xff0c;能加载但是效果不一定好&#xff0c;需要根据自己的板子进行适配&#xff1b; 2、驱动在内核中的两种形式 (1)直接编译进内核&#xff1a;内核启动时自…