牛客 BM76 正则表达式匹配 【动态规划】

news2025/1/10 11:30:17

描述

请实现一个函数用来匹配包括'.'和'*'的正则表达式。

1.模式中的字符'.'表示任意一个字符

2.模式中的字符'*'表示它前面的字符可以出现任意次(包含0次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

数据范围:

1.str 只包含从 a-z 的小写字母。

2.pattern 只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。

3. 0≤str.length≤26 
4. 0≤pattern.length≤26 

示例1

输入:

"aaa","a*a"

返回值:

true

说明:

中间的*可以出现任意次的a,所以可以出现1a,能匹配上             

示例2

输入:

"aad","c*a*d"

返回值:

true

说明:

因为这里 c 0 个,a被重复一次, * 表示零个或多个a。因此可以匹配字符串 "aad"             

示例3

输入:

"a",".*"

返回值:

true

说明:

".*" 表示可匹配零个或多个('*')任意字符('.'             

示例4

输入:

"aaab","a*a*a*c"

返回值:

false

 方法一:暴力递归

如果 pattern 中不存在 *,那这题只需要从左往右遍历一遍就可以了,但现在多了 *,所以需要递归各个位置的 * 不存在的 pattern,然后遍历

方法二:动态规划

创建 dpMap,标识 str 在 xPos 位置和 pattern 在 yPos 位置匹配。在 dpMap 中,唯一需要特殊处理的只有 *,所以我们聚焦 * 就可以了。为了方便初始化,额外添加一行一列 0,方便统一的状态转移。

1、因为 * 是跟随前一个字符,所以 * 的状态在 dpMap 中跟随前一个字母,即 dpMap[yPos][xPos] = dpMap[yPos-1][xPos]

2、因为 * 可以为 0 个字符,所以 * 的状态也可以跟随前两个字母,即 dpMap[yPos][xPos] |= dpMap[yPos-2][xPos]

3、当 * 与 str 的字母匹配时,它的状态额外可以从左上(前一个字符在前一个位置的状态)和左侧(当前字符在前一个位置的状态)转移过来,即  dpMap[yPos][xPos] |= (dpMap[yPos-1][xPos-1] || dpMap[yPos][xPos-1])

 最后只需要看 dpMap[length1][length2] 位置是否为 1 即可。

    public boolean match (String str, String pattern) {
        // write code here
        if ((str == null || str.isEmpty()) && (pattern == null || pattern.isEmpty())) {
            return true;
        }
        int length1 = str.length();
        int length2 = pattern.length();
        int xPos;
        int yPos;
        boolean[][] dpMap = new boolean[length2+1][length1+1];
        dpMap[0][0] = true;
        for (yPos = 1; yPos <= length2; yPos++) {
            char charP = pattern.charAt(yPos-1);
            for (xPos = 0; xPos <= length1; xPos++) {
                if (charP == '*') {
                    // 因为 * 可以为 0 个,所以 dpMap[yPos][xPos] 的值可以是上面的点转移,也可以是上两个点转移
                    dpMap[yPos][xPos] = dpMap[yPos-2][xPos];
                    dpMap[yPos][xPos] |= dpMap[yPos-1][xPos];
                    // 如果 * 成功匹配,dpMap[yPos][xPos] 的值还可以是左边或左上转移
                    if (xPos > 0 && isCharEquals(str, xPos-1, pattern, yPos-1)) {
                        dpMap[yPos][xPos] |= (dpMap[yPos-1][xPos-1] || dpMap[yPos][xPos-1]);
                    }
                    continue;
                }
                if (xPos > 0) {
                    dpMap[yPos][xPos] |= (isCharEquals(str, xPos-1, pattern, yPos-1) && dpMap[yPos-1][xPos-1]);
                }
            }
        }
        return dpMap[length2][length1];
    }

    public boolean isCharEquals(String str, int posS, String pattern, int posP) {
        char charP = pattern.charAt(posP);
        if (charP == '.') {
            return true;
        }
        char charS = str.charAt(posS);
        if (charP == '*') {
            char preCharP = pattern.charAt(posP-1);
            return preCharP == '.' ? true : preCharP == charS;
        } else {
            return charP == charS;
        }
    }

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

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

相关文章

可算是熬出头了,测试6年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

GPT_academic详细使用介绍与配置—可润色,翻译,解释代码(GPT助力学术,借助New Bing可实现免费使用)

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 绪论进入项目地址下载并解压到本地配置python3.11版本的虚拟环境安装运行所需的依赖库配置config配置代理文件配置GPT的api&#xff08;可选&#xff0c;按token计费&#xff09;配置NewBing的cookie&…

课程表 II:拓扑i排序

Problem: 210. 课程表 II 文章目录 思路解题方法1&#xff1a;首先新建一个inDegree数组用来存放所有的点的入度&#xff1a;int[] inDegree new int[numCourses];2&#xff1a;然后遍历所有子数组将所有点及其入度存进去&#xff0c;这道题就是课程号本身为坐标&#xff0c;对…

ASEMI代理长电可控硅PCR606:性能特点与应用领域

编辑-Z 可控硅&#xff08;Thyristor&#xff09;是一种半导体器件&#xff0c;具有高功率、高效率、高可靠性等优点。PCR606是一款常用的可控硅型号&#xff0c;广泛应用于各种电子设备中。本文将详细介绍PCR606的性能特点、工作原理以及在各个领域的应用。 一、PCR606性能特…

【算法学习系列】06 - 利用二分法查找有序数组中的某个数 num

文章目录 二分法说明实现 二分法验证实现暴力算法对数器使用验证结果 二分法 说明 二分法是一种常用的算法&#xff0c;也称为折半查找或二分查找。它适用于已经有序的数组中&#xff0c;通过将数组从中间划分成两个部分&#xff0c;每次根据目标值与中间值的大小比较来确定下…

基于InVEST模型的人类活动、重大工程生态成效评估、论文写作

查看原文>>>基于生态系统服务&#xff08;InVEST模型&#xff09;的人类活动、重大工程生态成效评估、论文写作 【学习目标】&#xff1a; 1) 采用InVEST模型&#xff0c;掌握产水&#xff08;包括水源涵养&#xff09;、碳存储&#xff08;包括固碳&#xff09;、土…

2023年最新苹果账号更改/注册为美区账号及免国外支付购买和充值美区App Store礼品卡教程

平时大家在使用IPhone手机时,应该有遇到软件明明是在App Store里上架的,但自己无论如何也搜索不到的情况吧!这种就是因为应用没有上架到你苹果账号所在的国家地区才导致的搜不到无法下载。比如:部分的新闻类、代[过滤]理类、游戏类应用以及Chat GPT等都无法在国区账号中搜索…

基于GPS+IMU的卡尔曼滤波融合定位算法MATLAB代码

资源地址&#xff1a; 基于GPSIMU的卡尔曼滤波融合定位算法MATLAB代码资源-CSDN文库 主要内容&#xff1a; 基于GPSIMU的卡尔曼滤波融合定位算法仿真,其中惯导用来进行状态预测,GPS用来滤波矫正&#xff0c;用于GPSIMU的卡尔曼滤波融合定位算法算法编程学习&#xff01;&…

如何以零停机时间或最少停机时间更新 Docker 容器,来确保应用程序持续可用

在现代应用程序开发和部署中&#xff0c;容器化技术已经成为一种常见的选择。Docker 容器的优势在于其轻量级、可移植性和可扩展性&#xff0c;但在更新容器时可能会面临停机时间的问题。本文将详细介绍如何以零停机时间或最少停机时间更新 Docker 容器&#xff0c;以确保应用程…

RedisTemplate

jedis是redis官网推荐的一个面向java客服端&#xff0c;库文件实现了对各类API进行封装调用。 lettuce是一个redis的驱动包&#xff0c;Lettuce译为生菜。 jedis和lettuce都是redis的客户端&#xff0c;他们可以连接redis服务器.但是在springbot2.0以后都是使用的Lettuce客户…

ImageCombiner是一个专门用于Java服务端图片合成的工具

1.1 项目背景 最近公司上了不少传播方面的需求&#xff0c;免不了合成各种营销图片&#xff0c;图片合成本身并不是什么高深的技术&#xff0c;但用底层api去搞确实繁琐&#xff0c;于是抽时间封装了一个小工具&#xff0c;初衷是解放生产力&#xff0c;后来发现挺好使&#x…

Unity之OpenXR+XR Interaction Toolkit实现 VR控制第一人称角色模型动画

前言 我们在开发VR项目时,有时会有第一人称视角的需求,即我们自己带上VR头显,能够看到自己的身体,如果模拟一些人物触电死亡,使用工具动画之类的需求,那么VR控制第一人称视角就比较实用了。 我们今天就来介绍一下如何实现VR设备控制第一人称: 1.角色手部跟随手柄移动和…

ERROR: No matching distribution found for ray解决办法

报错&#xff1a; from ray.rllib.algorithms.apex_dqn import ApexDQN ModuleNotFoundError: No module named ray 解决办法&#xff1a; pip install "ray[rllib]" -i https://pypi.tuna.tsinghua.edu.cn/simple

【网络技术】防火墙配置单机旁挂模式

组网需求 某公司网络部署Agile Controller服务器组&#xff0c;同时以旁挂方式部署FW于网络出口&#xff0c;如图1所示&#xff0c;要求&#xff1a; •用户角色不同&#xff0c;能访问的网络资源也不同&#xff08;在Agile Controller服务器中配置&#xff09;。 •用户角色…

k8s 中 pod 是如何做到网络共享的

前言 在k8s中, pod是编排的最小单位, 在同一个pod中, 容器之间能够共享hostname network 等内容. 共享network, 简单说就是同一个pod中的容器, 可以通过访问localhost互相访问, 且端口占用会冲突. 在之前的介绍中提到过, 容器的隔离是通过namespace技术实现的, 网络隔离自然…

Android新logcat使用技巧

Android新logcat使用技巧 logcat新UI出现后&#xff0c;我常困惑于怎么过滤log&#xff0c;和以前的UI差异比较大&#xff0c;新UI界面结构如下&#xff1a; 这个新的 logcat 的问题是如何过滤信息并不是很明显。 获取应用的日志信息 要获取我们当前调试应用的日志信息&…

技术大佬们都是怎么学习的?

目录 问题 熟悉更多业务 熟悉端到端 自学 Do exercise Learning trying Teaching 问题 今天逛帖子的时候&#xff0c;看到这么个问题&#xff1a; 这个问题我曾经也很好奇过&#xff0c;那些成为技术大佬的人当初是怎么学习&#xff0c;以及怎么成长过来的&#xff0…

就业内推 | 上市游戏公司,六险一金,最高30K*13薪

01 吉比特 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、参与公司整体网络规划&#xff0c;制定网络运行规范 2、负责网络监控、应急相应等日常运维工作&#xff0c;及时定位及故障处理 3、负责数据中心内基础架构维护 4、负责企业I…

低代码平台:解决项目管理中的瓶颈难题

随着数字化时代的到来&#xff0c;项目管理已经成为现代企业中不可或缺的一部分。尤其是在软件开发、信息技术、新产品开发等领域&#xff0c;项目管理的重要性更加凸显。然而&#xff0c;项目管理中存在着许多痛点和瓶颈难题&#xff0c;如项目周期长、成本高、协作难度大等。…

Spring Boot进阶(38):SpringBoot之跨域配置 | 超级详细,建议收藏

1. 前言&#x1f525; 我们都知道springboot默认日志是打印在控制台中的&#xff0c;不会以文件的形式进行保存。那么日后系统上线肯定是有需要对日志进行定位分析问题的&#xff0c;那么如何实现将控制台输出的日志保存起来&#xff1f; 这将又会是干货满满的一期&#xff0c;…