算法的学习笔记—正则表达式匹配的动态规划算法解析

news2024/11/15 10:03:24

img

😀前言
正则表达式是一种强大的工具,广泛应用于文本匹配和处理。在许多编程任务中,我们可能会遇到需要匹配字符串与某个特定模式的情况。本文将介绍如何使用动态规划算法实现一个支持 .* 的正则表达式匹配功能,并以 Java 为例进行代码实现。

🏠个人主页:尘觉主页

文章目录

  • 🥰正则表达式匹配的动态规划算法解析
    • 😃问题描述
    • 😆解题思路
      • 😘 状态定义
      • 😘转移方程
      • 😀代码解析
      • 😊示例分析
      • 😊时间与空间复杂度
    • 😄总结

🥰正则表达式匹配的动态规划算法解析

😃问题描述

给定一个字符串 str 和一个模式 pattern,要求实现一个函数来判断 str 是否匹配 pattern。其中,模式中包含的特殊字符有:

  • .:匹配任意单个字符。
  • *:匹配前一个字符任意次(包括 0 次)。

例如,字符串 "aaa" 与模式 "a.a""ab*ac*a" 匹配,但与模式 "aa.a""ab*a" 不匹配。

😆解题思路

要解决这个问题,我们可以使用动态规划来逐步构建匹配结果。动态规划的思想是将一个大问题拆解成一系列小问题,然后通过递归或迭代来解决这些小问题,从而得出最终结果。

😘 状态定义

我们定义一个二维数组 dp[m + 1][n + 1],其中 dp[i][j] 表示字符串 str 的前 i 个字符与模式 pattern 的前 j 个字符是否匹配。

😘转移方程

  1. 初始状态

    • 当字符串和模式都为空时,显然是匹配的,因此 dp[0][0] = true
    • 如果字符串为空但模式不为空,只有模式中的 * 可以匹配空字符串,因此我们需要初始化 dp[0][j]。如果模式的第 j 个字符是 *,那么它可以消去它前面的字符,因此 dp[0][j] = dp[0][j-2]
  2. str[i-1]pattern[j-1] 相等,或者 pattern[j-1]. 时,dp[i][j] 可以继承 dp[i-1][j-1] 的值,因为当前字符匹配,匹配结果取决于前面部分的匹配情况。

    pattern[j-1]* 时,有两种情况:

    1. * 将它前面的字符消掉,即 pattern[j-2] 可以被忽略,这时 dp[i][j] = dp[i][j-2]
    2. 如果 str[i-1]pattern[j-2] 相等,或者 pattern[j-2].,那么 * 可以代表一次或多次匹配,这时 dp[i][j] = dp[i-1][j]dp[i][j] = dp[i][j-1]
public class Solution {
    public boolean match(String str, String pattern) {
        int m = str.length(), n = pattern.length();
        boolean[][] dp = new boolean[m + 1][n + 1];

        // 初始化状态
        dp[0][0] = true;
        for (int j = 1; j <= n; j++) {
            if (pattern.charAt(j - 1) == '*') {
                dp[0][j] = dp[0][j - 2];
            }
        }

        // 动态规划填表
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 如果当前字符匹配,或者模式字符为 '.'
                if (str.charAt(i - 1) == pattern.charAt(j - 1) || pattern.charAt(j - 1) == '.') {
                    dp[i][j] = dp[i - 1][j - 1];
                } 
                // 如果模式字符为 '*'
                else if (pattern.charAt(j - 1) == '*') {
                    // * 代表 0 次
                    dp[i][j] = dp[i][j - 2];
                    // * 代表 1 次或多次
                    if (pattern.charAt(j - 2) == str.charAt(i - 1) || pattern.charAt(j - 2) == '.') {
                        dp[i][j] |= dp[i - 1][j];
                    }
                }
            }
        }

        // 返回最终匹配结果
        return dp[m][n];
    }
}

😀代码解析

  1. 初始化状态
    • dp[0][0] = true 表示空字符串与空模式匹配。
    • 对于只有 * 的模式,初始化 dp[0][j]dp[0][j-2],表示 * 号匹配 0 次。
  2. 动态规划填表
    • 如果当前字符匹配(包括 . 的情况),那么直接继承 dp[i-1][j-1] 的结果。
    • 如果当前模式字符为 *,则有两种情况:
      1. * 表示 0 次匹配,则继承 dp[i][j-2]
      2. * 表示 1 次或多次匹配,继承 dp[i-1][j],并用 |= 操作将结果合并。
  3. 返回结果
    • 最终,dp[m][n] 存储了字符串 str 与模式 pattern 是否匹配的结果。

😊示例分析

以字符串 "aaa" 和模式 "ab*ac*a" 为例,算法通过动态规划的方式一步步验证每个字符与模式的匹配关系。最终,通过矩阵 dp 的计算,可以判断 "aaa""ab*ac*a" 匹配。

😊时间与空间复杂度

  • 时间复杂度:O(m * n),其中 m 是字符串的长度,n 是模式的长度。动态规划矩阵的每个元素都需要被填充一次,因此时间复杂度为 O(m * n)。
  • 空间复杂度:O(m * n),需要一个二维矩阵存储动态规划的结果。

😄总结

本文介绍了一种基于动态规划的正则表达式匹配算法,能够有效处理带有 .* 的复杂模式匹配问题。通过构建和解析状态转移方程,该算法可以在多种匹配场景下表现出色,并且具有线性时间和空间复杂度,适合大规模数据的匹配任务。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

中科院TOP“灌水神刊”合集!年发文量动辄数千篇,TOP的地位,4区的录用率!

【SciencePub学术】本期&#xff0c;给大家推荐几本环境领域的“灌水神刊”&#xff01;均隶属于中科院TOP刊之列&#xff0c;但是每年庞大的发文量致使投稿接收率极高&#xff01;话不多说&#xff0c;想“灌水”的建议收藏&#xff01; 01 年刊文量4000 Journal of Cleaner …

【C++】---红黑树详解

【C】---红黑树详解 一、什么是红黑树&#xff1f;1、概念2、性质3、四个规则 二、红黑树的定义1、红黑树 结点 定义&#xff08;1&#xff09;将新插入的结点 设置为黑色&#xff08;2&#xff09;将新插入的结点 设置为红色 2、红黑树的定义 三、红黑树插入1、插入节点2、控制…

Zabbix自动导出PDF报告

zabbix6提供了定时导出PDF报告功能。此功能可按照Dashboard维度&#xff0c;定时自动导出报告&#xff0c;并通过邮件发送。 1.安装 zabbix 提供了官方的rhel8版本的rpm包&#xff0c;可使用yum方式安装&#xff0c;zabbix自动导出PDF功能是基于go环境的zabbix web service程…

应用方案 | 低功耗接地故障控制器D4145

一、概述 D4145 是一个接地故障断路器。它能够检测到不良的接地条件&#xff0c;譬如装置接触到水时&#xff0c;它会在有害或致命的电击发生之前将电路断开。 D4145能检测并保护从火线到地线,从零线到地线的故障.这种简单而传统的电路设计能够确保其应用自如和长时间的可靠性。…

Vue3+Echarts+Setup实现动态曲线堆叠图+图例分页

提前安装引入echarts 效果图 dom实例 <div id"rightCharterwang" style"height: 28vh"></div> 配置项&#xff0c;将数据换成从接口请求回来的数据&#xff08;这里是写死的假数据&#xff09; const rightCharterwang () > {let named…

vcruntime140_1.dll丢失是什样的错误?五种vcruntime140_1.dll修复方法详细步骤教程

对于经常使用Windows操作系统的用户来说&#xff0c;面对“vcruntime140_1.dll文件丢失”的错误提示可能既熟悉又令人苦恼。这个错误通常发生在尝试启动或安装一些依赖于此特定DLL文件的应用程序时&#xff0c;在本文中&#xff0c;我们将详细介绍 ​vcruntime140_1.dll​ 所承…

使用Python和Pillow创建照片马赛克应用

在这篇博客中,我们将探讨如何使用Python创建一个简单而有趣的桌面应用程序。我们的目标是构建一个应用,允许用户选择一张照片,然后在照片的右下角添加马赛克效果。这个项目将展示如何结合使用wxPython来创建图形用户界面(GUI)和Pillow库来处理图像。 D:\spiderdocs\eraselogo.p…

Linux 基本指令讲解 上

linux 基本指令 clear 清屏 Alt Enter 全屏/退出全屏 pwd 显示当前用户所处路径 cd 改变目录 cd /root/mikecd … 返回上级目录cd - 返回最近所处的路径cd ~ 直接返回当前用户自己的家目 roor 中&#xff1a;/root普通用户中&#xff1a;/home/mike mkdir 创建一个文件夹(d) …

通义灵码:AI 研发趋势与效果提升实践丨SDCon 全球软件技术大会演讲全文整理

作者&#xff1a;张昕东 大家好&#xff0c;我是来自阿里云通义灵码团队的张昕东。很高兴和各位同仁做这次分享&#xff0c;分享的主题是人机协同趋势与效果提升实践。我们所做的模型提升和功能开发是为了促进人机在研发领域的协同&#xff0c;而当今的人机协同现状又决定了我…

基于Spring Boot的农田智能管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 农田智能管理系统是基于SpringBoot框架开发的一款针对农田管理的智能化平台。随着农业现代化的发展&#xff0c;农田管理需要更…

docker拉取kafka镜像|启动kafka容器

1、kafka官网快速开始模块查看如何拉取kafka的docker镜像 https://kafka.apache.org/quickstart 2、移除本机已拉取kafka的docker镜像 docker rmi apache/kafka:3.7.03、拉取kafka的docker镜像 docker pull apache/kafka:3.7.04、启动kafka容器 docker run -p 9092:9092 ap…

iOS 18(macOS 15)Vision 中新增的任意图片智能评分功能试玩

概述 在 WWDC 24 中库克“大厨”除了为 iOS 18 等平台重磅新增了 Apple Intelligence 以外&#xff0c;苹果也利用愈发成熟的机器学习引擎扩展了诸多内置框架&#xff0c;其中就包括 Vision。 想用本机人工智能自动为我们心仪的图片打一个“观赏分”吗&#xff1f;“如意如意&…

【2.3】回溯算法-重新排序得到 2 的幂

一、题目 给定正整数N&#xff0c;我们按任何顺序&#xff08;包括原始顺序&#xff09;将 数字重新排序 &#xff0c;注意其前导数字不能为零。 如果我们可以通过上述方式得到2的幂&#xff0c;返回 true&#xff1b;否则&#xff0c;返回false。 提示&#xff1a; 1 < …

学习记录第二十六天

进程运行 1&#xff0c;子进程和父进程做相同的事----创建子进程 执行任务 2&#xff0c;子进程做与父进程不同的事 ----fork exec exec族 l VS v :主要是第二个参数的传参方式不同 p :表示寻找可执行文件 是通过PATA环境变量 e : 表示可以给…

升级软文发稿开源系统源码论文期刊一键发布

升级软文发稿运营管理源码—论文期刊一键发布 软文发稿系统源码&#xff08;软文发布系统&#xff09;在基于旧版本的媒介软文发布平台项目改造升级了新的功能模块简称&#xff08;3.0版&#xff09;本系统还是基于开源的PHPMYSQLlayui&#xff08;前端界面&#xff09;代码进行…

唐山网站建设方案优化

唐山作为一个重要的工业城市&#xff0c;网站建设在这里具有重要的意义。为了更好地服务于市民和企业&#xff0c;唐山网站建设方案需要不断优化和更新。下面将从内容、技术和设计三个方面来探讨唐山网站建设方案的优化。 首先是内容方面。唐山作为一个历史悠久且拥有丰富文化底…

如何提高遭受网络攻击后的恢复速度

现实促使组织探索提供更快恢复和增强安全性的替代网络保护和恢复方法&#xff0c;尤其是在更严格的法规驱动下&#xff0c;这种紧迫感愈加明显。以下是一些提高网络安全策略恢复速度的方法。 近年来&#xff0c;勒索软件攻击已成为一个重大且令人担忧的趋势&#xff0c;其频率和…

Spring之最基础的创建与Bean的存储与获取(还有Maven加载jar包报错的解决方法)

目录 创建Spring项目 如何解决Maven加载jar包报错 存储Bean和取Bean 在Java中对象也称为Bean。所以后面我提到Bean&#xff0c;大家要知道我说的是什么。 创建Spring项目 我的idea是2022版本的&#xff0c;如果大家和我一样可以参考我的。 1.创建一个Maven项目。图片上忘了…

【TiDB】08-离线部署TiDB 8.1

目录 1、环境检查 1.1、检测及关闭系统 swap 1.2、设置TiDB节点的临时空间 1.3、安装NTP服务 1.3.1、更新apt源 1.3.2、安装NTP 1.3.3、将本机作为NTP服务器 1.3.4、客户端连接 1.4、配置SSH互信及sudo免密码 2、离线安装 2.1、下载离线安装包 2.2、解压安装 2.3、…

YOLOv8改进 | 主干网络 | 动态调整目标的感受野的LSKNet【旋转目标检测SOTA】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…