6-正则表达式匹配

C#集成Bartender:动态图片标签打印的实战与优化 本文详细介绍了在C#程序中集成Bartender实现动态图片标签打印的实战方法与优化策略。通过具名数据源绑定、图片对象尺寸控制等核心技巧,解决了动态图片显示/隐藏的难题,并提供了从模板设计、代码架构到性能优化、错误处理的全流程指南,帮助开发者构建稳定高效的工业级标签打印系统。 阅读详情

题目

给你一个字符串 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
解释:".
” 表示可匹配零个或多个(’*’)任意字符(’.’)。

示例 4:

输入:s = “aab” p = “cab”
输出:true
解释:因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。

示例 5:

输入:s = “mississippi” p = “misisp*.”
输出:false

题解

class Solution {
    public boolean isMatch(String s, String p) {
        int m=s.length();
        int n=p.length();
        boolean[][] dp=new boolean[m+1][n+1];//dp[i][j]代表第i个a和第j个b是否匹配
        dp[0][0]=true;
        for(int j=1;j<=n;j++){//a为空,b的匹配情况,遇*直接跨越
            if(p.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(p.charAt(j-1)=='*'){
                    if(p.charAt(j-2)=='.'||p.charAt(j-2)==s.charAt(i-1)){//有*时p前移两格匹配,s只要前移一格,注意:s移的是i!!
                        dp[i][j]=dp[i-1][j]||dp[i][j-2];
                    }else{
                        dp[i][j]=dp[i][j-2];
                    }
                }else{
                    if(p.charAt(j-1)==s.charAt(i-1)||p.charAt(j-1)=='.'){
                        dp[i][j]=dp[i-1][j-1];
                    }
                }
            }
        }
        return dp[m][n];
    }
}

思路:

  1. 以一个例子详解动态规划转移方程:
    S = abbbbc
    P = ab*d*c
    1. 当 i, j 指向的字符均为字母(或 '.' 可以看成一个特殊的字母)时,
       只需判断对应位置的字符即可,
       若相等,只需判断 i,j 之前的字符串是否匹配即可,转化为子问题 f[i-1][j-1].
       若不等,则当前的 i,j 肯定不能匹配,为 false.
       
           f[i-1][j-1]   i
                |        |
       S [a  b  b  b  b][c] 
       
       P [a  b  *  d  *][c]
                         |
                         j
       
    
    2. 如果当前 j 指向的字符为 '*',则不妨把类似 'a*', 'b*' 等的当成整体看待。
       看下面的例子
    
                i
                |
       S  a  b [b] b  b  c  
       
       P  a [b  *] d  *  c
                |
                j
       
       注意到当 'b*' 匹配完 'b' 之后,它仍然可以继续发挥作用。
       因此可以只把 i 前移一位,而不丢弃 'b*', 转化为子问题 f[i-1][j]:
       
             i
             | <--
       S  a [b] b  b  b  c  
       
       P  a [b  *] d  *  c
                |
                j
       
       另外,也可以选择让 'b*' 不再进行匹配,把 'b*' 丢弃。
       转化为子问题 f[i][j-2]:
    
                i
                |
       S  a  b [b] b  b  c  
        
       P [a] b  *  d  *  c
          |
          j <--
    
    3. 冗余的状态转移不会影响答案,
       因为当 j 指向 'b*' 中的 'b' 时, 这个状态对于答案是没有用的,
       原因参见评论区 稳中求胜 的解释, 当 j 指向 '*' 时,
       dp[i][j]只与dp[i][j-2]有关, 跳过了 dp[i][j-1].
    
  2. 归纳:
    如果 p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1];
    如果 p.charAt(j) == '.' : dp[i][j] = dp[i-1][j-1];
    如果 p.charAt(j) == '*':
    	如果 p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this case, a* only counts as empty
    	如果 p.charAt(i-1) == s.charAt(i) or p.charAt(i-1) == '.':
    	dp[i][j] = dp[i-1][j] //in this case, a* counts as multiple a
    	or dp[i][j] = dp[i][j-1] // in this case, a* counts as single a
    	or dp[i][j] = dp[i][j-2] // in this case, a* counts as empty
    
  3. 如果a串为空,b串不空,则看看是否有带*的情况,有的话就b前移两个

    如果ab都不空,则也分两种情况:如果b有xing*,则检查b的前一个字母和a是否相同,或者b前一个是不是.,两者满足一个都可以,dp就更新到或者跳过a的那个字母,或者跳过b的两个字母;如果b无xing*,则检查两个字符串的前一个字母是否相同,相同则前移。

  4. 之所以可以在j-1的循环里用j-2是因为*前面肯定是跟着别的字母的,*不会在最前面。

【生物识别模组介绍】静脉识别模组 静脉识别技术是依据流动的静脉血液中的血红蛋白对近红外光有所吸收,通过近红外光照射手指、手掌、面部、腕部呈现的分布图像,再使用特定的算法对图像进行特征提取、分析比对,从而进行身份认证识别。静脉结构相同几率为34亿分之一,每个人的静脉结构具有独特性,而且静脉特征图像自成年后终身不变,不受外部环境、疾病等影响,是人体最稳定的生物特征之一。商务合作联系:newmagicmission@gmail.com图1.0。 阅读详情

相关推荐

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 404

正则表达式选中多行

在一些IDE中复制代码,代码又很长,所以需要用正则表达式快速选中对应的模块,做法就是在选中的首位加上对应的标志

qq_41841073的博客 732

基于 国产USRP B210 的通信+侦测+干扰三合一实验平台,解锁无线攻防全场景!

在当代复杂电磁环境与多样化通信需求并存的背景下,软件定义无线电(SDR)技术正展现出前所未有的系统灵活性与功能可重构性。由两台USRP-LW B210软件无线电设备模拟无线链路通信过程,能够模拟多种无线通信信号传输及图像传输场景,适用于通信协议验证、抗干扰测试及教学实验。,支持"通信-侦测-干扰-优化"的闭环实验流程,为无线通信领域的教学科研与工程应用提供了一套经济高效、功能完备的解决方案。系统可对通信链路信号进行快速、自动化侦测、识别、告警,并支持多种干扰信号生成、模式切换及效果评估功能。

luowave2012的博客 834

正则表达式教程

正则表达式 匹配非打印字符(assii码前27个 除了0 \cx: 例: \ci 匹配ctrl+i(windows系统下面 ) 匹配类似\t的字符 就是匹配ascii码的第十个字符,和字母表顺序错开一个,因为零不匹配,这个x可以是a-z,A-Z,别的字符跟在\c后面将当做匹配‘c’字符...

chihaipi6356的博客 152

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 298

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 142

正则表达式使用之位置匹配

正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话。 然而大部分人学习正则时,对于匹配位置的重视程度没有那么高。 本章讲讲正则匹配位置的相关知识点。 内容包括: 什么是位置? 如何匹配位置? 位置的特性 几个应用实例分析 1|0什么是位置呢? 位置(锚)是相邻字符之间的位置。比如,下图中箭头所指的地方: 2|0如何匹配位置呢? ^、$、\b、\B、(?=p)、(?!p) 相应的可视化形式是: 2|1^ 和 $ ^(脱字符)匹配开头,在多行匹配中匹配行开头。 $

Hohxill的博客 3865

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 1万+

22-正则高级应用:匹配一行完整的字符串

这一章中我会学习如何根据特定的条件从文件中匹配完整的一行字符串。例如指定包含一组单词,或者指定不包含一组单词。我们会用到正则的预测断言特性。

David糖的博客 1万+

Orin+ GMSL (Ser 9295+Des 9296)流程分析(1)

orin gmsl

乐于分享 2665

【Python计量】linearmodels面板数据回归(一)

我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。

mfsdmlove的博客 9277

LeetCode 10 正则表达式匹配 NC122 正则表达式匹配

给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 示例 1: 输入:s = "aa" p = "a" 输出:false 解释:"a" 无法匹配 "aa" 整个字符串。 示例 2: 输入:s = "aa" p = "a*" 输出:true 解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素...........

麦格芬230的博客 344

IIC软件协议及硬件知识汇总

IIC软件协议及硬件相关知识,真的是非常齐全了!

记得诚 1万+

正则表达式 匹配 id=_NetView 6.3支持正则表达式

NetView 6.3支持正则表达式(regex)啦,一起看看如何在NetView 6.3中运用它吧!正则表达式是一种抽象描述文本字符串所需格式的模式,它通常被用来检索、验证符合某个模式的文本,由于它具有灵活性、逻辑性和功能性强等特点,NetView 6.3开始在以下三个组件中支持正则表达式:PIPE LOCATE/NLOCATE stage:增加了一个REGEX功能,提高了对消息和字符...

weixin_39625098的博客 196

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ES6正则表达式u标志:解决Unicode匹配难题的终极方案

你是否遇到过JavaScript中正则表达式匹配中文、Emoji或其他Unicode字符时出现的诡异问题?比如一个中文字符被识别为两个字符长度,或者无法正确匹配某些特殊符号?ES6引入的正则表达式`u`标志(Unicode模式)彻底解决了这些困扰开发者多年的Unicode匹配难题。本文将通过实际案例和代码示例,带你全面掌握这一强大功能,让你的正则表达式完美支持全球语言和符号。 ## Unicod...

gitblog_01096的博客 1175

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ES6粘性匹配终极指南:如何用y标志提升正则表达式性能300%

ES6粘性匹配(Sticky Matching)是ECMAScript 6引入的正则表达式革命性功能,通过y标志让正则表达式匹配位置保持粘性,实现性能的指数级提升!🚀 在本文中,我们将深入探讨ES6粘性匹配的工作原理、性能优势以及实际应用场景。 ## 什么是ES6粘性匹配? ES6粘性匹配是正则表达式的一个全新匹配模式,通过在正则表达式后添加y标志来启用。与传统的全局匹配不同,粘性匹配会在每

gitblog_07236的博客 1015

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

正则表达式匹配分组(6)

正则表达式匹配分组(6) 1. 匹配分组相关正则表达式 代码 功能 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 \num 引用分组num匹配到的字符串 (?P) 分组起别名 (?P=name) 引用别名为name分组匹配到的字符串 示例1:| 需求:在列表中[“apple”, “banana”, “orange”, “pear”],匹配ap...

汪云辉的博客 763

正则表达式6——位置匹配

一、边界 使用边界限定符来解决指定匹配操作在什么位置发生   二、单词边界 \b      指定单词边界(使用最多),用于匹配一个单词的开始和结尾 \B       表明不匹配一个单词边界,即查找前或后都有多余空格的字符    三、字符串边界 ^         定义字符串的开头 $          定义字符串的结尾 如果与(?m)配合使用,^和$还将匹配一个

happylife1527的专栏 387

mysql 匹配任意字符_MySQL入门-6:通配符匹配和正则表达式

大纲1、文件名匹配2、LIKE操作符3、使用正则表达式一、文件名匹配在Windows的CMD命令行和Linux的Bash中,都支持文件名通配,但是这个匹配能力非常弱,由于仅用于匹配文件名,所以也不算什么缺陷。比如我想查看后缀名为.txt的所有文件:#ls*.txt通常支持的通配符有:* 匹配任意字符任意次? 仅匹配任意单个字符[0-9a-zA-Z] 字符集,匹配任意列出...

weixin_35513543的博客 4902

1.6 正则表达式【匹配非字母和数字】

字母和数字匹配符 \W \W可以配置 非字母和数字,等价于[^a-zA-Z0-9] 。 测试实例 被匹配字符串 private static final String test1 = "a12.a,df3.1d-2tt.*"; 匹配公式3 匹配公式 String expression3 = "\\W"; 匹配结果 匹配公式4 匹配公式 String exp...

qq_26462567的博客 2万+

正则表达式菜鸟教程6匹配规则

正则表达式 - 匹配规则 基本模式匹配 一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a ti

FL1623863129的博客 1087

LeetCode热题(6.正则表达式匹配)

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

识时务者的个人博客 10万+

java 正则匹配多个,Java 6正则表达式是一组的多个匹配项

Here is simple pattern: [key]: [value1] [value2] [value3] [valueN]I want to get:keyarray of valuesHere is my regex: ^([^:]+):(:? ([^ ]+))++$Here is my text: foo: a b c dMatcher gives me 2 groups: foo ...

weixin_36189159的博客 698

Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配《转》

//贪婪匹配 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '<html><head><title>标题</title></head><body>内容</body></h...

238

6.正则表达式入门之选择匹配

?=、?<=、?!、?<! 的使用区别: 1. ?= exp1(?=exp2):查找 exp2 前面的 exp1。 例子: public static void main(String[] args) { String str="life is a fuck _movie"; //获得一个正则表达式对象 Pattern p = Pattern.compile("life(?= is)"); //使用正则表达式对象处理指定字符串,并获得结果对象 Match

c1776167012的博客 461

new 正则表达式匹配 6.6 又看一遍 匹配*需要注意??? leetcode 10 动态规划

题目描述 请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配 标题 解这题需要把题意仔细研究清楚,反正我试了好多次才明白的。 首先,考虑特殊情况: 1>两个...

mengmengkuaipao的博客 187
上一篇: 518-零钱兑换 II(完全背包)
下一篇: 11-盛最多水的容器
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值