【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅

【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅

本篇博主将给大家分享如何解答正则表达式与通配符匹配问题;干货满满,值得收藏呀;这两种匹配方式在 LeetCode 的题目中,可不会轻易让我们过关。题目往往会给出各种各样复杂的匹配规则和字符串场景,要求我们巧妙运用正则表达式或通配符的特性,编写出高效且正确的解决方案。

那么,下面我们就开启这场旅行吧!!!

  

  

  

   :羑悻的小杀马特.-ZEEKLOG博客羑悻的小杀马特.擅长C/C++题海汇总,AI学习,c++的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c++,c语言,ubuntu,linux,数据结构领域.https://blog.ZEEKLOG.net/2401_82648291?type=latelyhttps://blog.ZEEKLOG.net/2401_82648291?type=latelyhttps://blog.ZEEKLOG.net/2401_82648291?type=lately

 欢迎拜访羑悻的小杀马特.-ZEEKLOG博客

本篇主题:正则表达式与通配符匹配解答(绝对巧解)

制作日期:2025.02.03

隶属专栏:
C/C++题海汇总

首先大家肯定有可能对正则表达式与通配符匹配有点陌生;那么下面我们通俗易懂介绍一下吧:

目录

一·正则表达式与通配符匹配介绍:

1.1正则表达式匹配:

1.2 通配符匹配:

二.通配符匹配:

2.1题目简述:

2.2解答思路:

2.2.1状态定义:

 2.2.2状态方程书写:

2.2.3 初始化:

2.2.4填表顺序:

2.2.5确定返回值:

2.3解答代码:

三·正则表达式匹配:

 3.1题目简述:

3.2解答思路:

状态方程表示:

初始化: 

3.3解答代码:

 四·本篇小结:


一·正则表达式与通配符匹配介绍:

1.1正则表达式匹配:

定义:用特定字符和规则组成模式,精准描述字符串特征,实现复杂字符串匹配、查找、替换等操作。规则特点:规则丰富复杂,有元字符(如 . 匹配任意单个字符、* 匹配零个或多个前面元素等),可表达细致匹配要求。应用场景:适用于对匹配精度要求高的场景,像数据验证(邮箱、手机号格式)、文本提取(从网页抓取特定信息)。

1.2 通配符匹配:

定义:使用简单符号代表任意字符或字符串来进行匹配。规则特点:规则简单,常见通配符有 *(匹配任意数量任意字符)和 ?(匹配单个任意字符)。应用场景:多用于文件搜索(如查找所有 .txt 文件)、简单文本筛选,对匹配精度要求相对低。

下面以两道经典匹配问题来带大家深入探究:

二.通配符匹配:

2.1题目简述:

测试用例:

示例 1:输入:s = "aa", p = "a" 输出:false 解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:输入:s = "aa", p = "*" 输出:true 解释:'*' 可以匹配任意字符串。

示例 3:输入:s = "cb", p = "?a" 输出:false 解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

题目传送门: 44. 通配符匹配 - 力扣(LeetCode)

题意分析:

首先,我们先把题目的要求根据用例简述一下并呈现出来:

也就是拿p串去和s串进行匹配;其中s串只有小写字符;而p串多了?和*;即?随便匹配s的任意一个字符;而*可以匹配s中全部字符(包括空字符,空串)(是不是一开是大家就认为只要p有个*就可以完全匹配s了???然而如果p存在非* 的还要完成与s串中的字符进行匹配)

故这里空串的思想很重要;当然在匹配中也很重要(后面如果dp初始化也很重要)。

2.2解答思路:

这里我们做过一些动归的题目就很容易想到是字符串两个数组的dp问题了;如果没头绪可以做一做力扣的最长公共子序列问题(传送门:1143. 最长公共子序列 - 力扣(LeetCode));就懂啦,这里就先不做解释了。

那就贴一下1143的解答代码:

class Solution { public: //dp[i][j]表示t2的0-j及t1的0-i区间内最长公共子序列的长度 int longestCommonSubsequence(string t1, string t2) { int m=t1.size(); int n=t2.size(); vector<vector<int>> dp(m+1,vector<int>(n+1));+t1;+t2; //分情况:最后一个字符i j 对应值是否同: //同:dp[i-1][j-1]+1 不同:dp[i-1][j],dp[i][j-1],dp[i-1][j-1]分别是只包含j 只包含i 两个都不包含;最后一个可优化 for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ //dp[i][j]=t1[i-1]==t2[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]); dp[i][j]=t1[i]==t2[j]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]); } } return dp[m][n]; } };

下面我们这个思路了;因此就走动态规划的那五步吧。 

首先我们进行状态定义:

2.2.1状态定义:

 dp[i][j]表示p串0-j区间能否匹配s串0-i区间的整个字符串

 2.2.2状态方程书写:

先剧透一下,这里状态方程确实有点不好写;但是只要理解了就不算问题了;下面博主深入带大家分析分析一下:

根据我们老套路;从最后一个位置分情况向前推导:

我们p[j]位置的值要么是a-z 要么是? 要么是*;因此我们可以从这三方面分析;下面画图来分析下:

下面就是优化方案:

 

因此我们的状态方程就得到了:

2.2.3 初始化:

这里我们采取引入空串的一一对应方式来;故在s p串前面都加上空格;这样dp与s p数组交错时候就不用错位了。

即当我们定义完dp的时候;加上这句代码:

s=' '+s,p=' '+p;

代码判断: 

 dp[0][0]=1; for(int k=1;k<=n;k++) { if(p[k]=='*') dp[0][k]=1; else break; }

2.2.4填表顺序:

这里里根据填表时用到的量可以发现是上下左右的顺序;即正常遍历即可。 

2.2.5确定返回值:

即返回我们dp[m][n]即可。

2.3解答代码:

class Solution { public: //思路:分 ? a-z * 的三种情况 外加数学公式化简*的情况: bool isMatch(string s, string p) { int m=s.size(); int n=p.size(); vector<vector<bool>>dp(m+1,vector<bool>(n+1)); //初始化:+s,p=' '+p; //根据dp对应的定义分析填充第0行: dp[0][0]=1; for(int k=1;k<=n;k++) { if(p[k]=='*') dp[0][k]=1; else break; } //填表: for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(p[j]=='*') dp[i][j]=dp[i][j-1]||dp[i-1][j]; else dp[i][j]=(s[i]==p[j]||p[j]=='?')&&dp[i-1][j-1]; } } return dp[m][n]; } };

三·正则表达式匹配:

 3.1题目简述:

测试用例:

示例 1:输入:s = "aa", p = "a" 输出:false 解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:输入:s = "aa", p = "a*" 输出:true 解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3:输入:s = "ab", p = ".*" 输出:true 解释:".*" 表示可匹配零个或多个('*')任意字符('.')。

注意事项:

 

也就是p的*前一定是a-z。

题目传送门: 10. 正则表达式匹配 - 力扣(LeetCode)

3.2解答思路:

 和上面的通配符匹配相差不大;只不过是*前面必须要有.或者a-z;然后把?换成了.

因此我们就只详细分析一下*的情况就好。

下面我们就从不同于上面的地方即状态方程书写初始化来分析:

状态方程表示:

 

初始化: 

这里由于*的操作变了故只有当s串为空串的时候会发生变化;画图理解下:

代码判断:

dp[0][0]=1; for(int k=2;k<=n;k+=2) { if(p[k]=='*') dp[0][k]=1; else break; }

上下的都雷同通配符匹配问题啦;不做解释了。

3.3解答代码:

class Solution { public: bool isMatch(string s, string p) { int m=s.size(); int n=p.size(); vector<vector<bool>>dp(m+1,vector<bool>(n+1)); //初始化:+s,p=' '+p; dp[0][0]=1; for(int k=2;k<=n;k+=2) { if(p[k]=='*') dp[0][k]=1; else break; } //填表: for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(p[j]=='*') dp[i][j]=dp[i][j-2]||((s[i]==p[j-1]||p[j-1]=='.')&&dp[i-1][j]); else dp[i][j]=(s[i]==p[j]||p[j]=='.')&&dp[i-1][j-1]; } } return dp[m][n]; } };

 四·本篇小结:

博主通过对这两道题进行尝试解答以及分享题解的过程总结出:

对于题解我们更要侧重于怎么往这方面想也就是为什么这么做;而不是直接按照规则把代码套上去;侧重于多画图分析讨论如何能得出这样的做法;学习别人的优秀代码解法并引导自己如何往这方面想:比如当p[j]对应的*时候;如何更好的优化;以及怎么把写出来繁琐的状态方程图化成简短的代码(更要仔细慎重以免出错)。

总而言之;多画图多理解多分析多学习外加仔细仔细再仔细。

                        感谢大家关注本篇分享到此希望对大家有所帮助!!! 

Read more

【论文阅读】Gaussian Grouping: Segment and Edit Anything in 3D Scenes

【论文阅读】Gaussian Grouping: Segment and Edit Anything in 3D Scenes

摘要 高斯投影(Gaussian Splatting)实现了高质量、实时的三维场景新视点合成。不过,它仅专注于外观和几何建模,缺乏对细粒度的物体级场景理解。为了解决这一问题,我们提出了 Gaussian Grouping,将高斯点扩展为联合重建和分割开放世界三维场景中的任意内容。我们为每个高斯添加了一个紧凑的身份编码(Identity Encoding),使得这些高斯点能够根据其在三维场景中的物体实例或“物体/背景”的成员关系进行分组。并不依赖昂贵的三维标签,我们在可微渲染过程中通过利用 Segment Anything Model (SAM) 的二维掩码预测,以及引入的三维空间一致性正则化,对身份编码进行监督。与隐式的 NeRF 表示相比,我们表明离散且分组的三维高斯点能够在三维中以高视觉质量、细粒度和高效性来重建、分割和编辑任意内容。 引言 本文旨在构建一个 expressive 的三维场景表示,不仅对外观和几何进行建模,还捕捉场景中每个实例和物体的身份信息。我们的方法以最近的三维高斯投影(Gaussian Splatting)为基础,将其从纯粹的三维重建扩展到细粒度的场景

By Ne0inhk
【花雕学编程】Arduino BLDC 之自适应阻抗控制的外骨骼机器人

【花雕学编程】Arduino BLDC 之自适应阻抗控制的外骨骼机器人

基于 Arduino 的无刷直流电机(BLDC)实现自适应阻抗控制的外骨骼机器人,代表了康复工程与智能控制领域的前沿方向。该系统旨在让机器人的运动特性(如刚度、阻尼)不再是固定的,而是能根据人体意图和环境交互力实时调整,从而实现如“肌肉”般柔顺、自然的协同运动。 1、 主要特点 类肌肉的柔顺驱动特性 这是阻抗控制的核心优势,旨在模拟生物系统的运动特性。 力-位置耦合关系: 传统的刚性位置控制容易导致人机交互中的“动力对抗”。自适应阻抗控制将外骨骼关节建模为一个虚拟的弹簧-阻尼系统。这使得外骨骼在受到外部推力时能产生顺应性位移,而非硬性抵抗,极大提升了穿戴舒适度与安全性。 无感交互: 通过 BLDC 配合 FOC(磁场定向控制),可以实现高精度的力矩控制,精确复现阻抗模型所需的输出力,让人感觉像是在自然行走,而非被机器“拖着走”。 基于生理信号的自适应机制 “自适应”是该系统的进阶特征,它解决了固定参数无法适应复杂人体需求的问题。 意图识别: 系统通过传感器(如表面肌电 sEMG 传感器、IMU 惯性测量单元或足底压力传感器)实时采集穿戴者的运动意图和生理状态。

By Ne0inhk
FPGA:高速接口JESD204B以及FPGA实现

FPGA:高速接口JESD204B以及FPGA实现

本文将先介绍JESD204B高速接口的基本概念和特性,然后详细说明如何基于Xilinx Kintex-7系列FPGA实现JESD204B高速接口。 一、JESD204B高速接口介绍 JESD204B是由JEDEC(固态技术协会)制定的一种高速串行通信标准,主要用于数据转换器(如ADC、DAC)与数字处理单元(如FPGA、ASIC)之间的高速数据传输。以下是JESD204B的主要特点和优势: 1. 高速串行通信: * JESD204B采用差分对(SerDes)进行高速串行数据传输,单通道速率可达12.5 Gbps(JESD204C进一步提升至32 Gbps)。 * 通过多通道(lanes)并行传输,支持更高的总带宽,适合高采样率、高分辨率的数据转换器。 2. 主要特性: * 同步性:提供确定性延迟(Deterministic Latency),通过子类(Subclass 0/1/2)支持不同同步需求,Subclass 1广泛用于需要精确同步的应用。 * 多设备同步:支持多个ADC/DAC与FPGA之间的同步,SYSREF信号用于对齐时钟和帧。

By Ne0inhk

【GitHub项目推荐--AI-Goofish-Monitor:闲鱼智能监控机器人完全指南】

简介 AI-Goofish-Monitor 是一个基于 Playwright 和 AI 技术的闲鱼(Goofish)多任务实时监控与智能分析工具。该项目由 dingyufei615 开发,通过先进的浏览器自动化技术和多模态大语言模型,为用户提供智能化的闲鱼商品监控解决方案。该工具不仅具备强大的数据采集能力,还配备了功能完善的 Web 管理界面,让用户能够轻松管理和配置监控任务。 🔗 GitHub地址 : https://github.com/dingyufei615/ai-goofish-monitor ⚡ 核心价值 : AI智能分析 · 多任务监控 · 实时通知 · Web管理界面 技术特色 : * AI驱动 :集成多模态大语言模型(GPT-4o、Gemini等),深度分析商品信息 * Web管理 :完整的可视化界面,无需命令行操作 * 多平台通知 :支持 ntfy.sh、企业微信、Bark 等多种通知方式 * 智能过滤 :基于自然语言的任务创建和AI分析标准生成 * 云原生支持 :提供

By Ne0inhk