【LeetCode: 10. 正则表达式匹配 | 暴力递归=>记忆化搜索=>动态规划 】

深度解析「正则表达式匹配」:从暴力解法到动态规划 点击蓝色“五分钟学算法”关注我哟 加个“星标”,一起学算法 今天分享的题目来源于 LeetCode 上第 10 号问题:正则表达式匹配。题目难度为 Hard,目前通过率为 23.9% 。 温馨提示:本题目有点难,干货有点干,建议先收藏后再仔细阅读。 题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和'*'... 阅读详情

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🚩 题目链接

⛲ 题目描述

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

提示:

1 <= s.length <= 20
1 <= p.length <= 20
s 只包含从 a-z 的小写字母。
p 只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路
  1. 再学习这道题题目之前,大家可以先去看一下我另一道和这个题目非常相似的题目,通配符匹配的题解,再来学习这道题目就会非常容易。【LeetCode: 44. 通配符匹配 | 暴力递归=>记忆化搜索=>动态规划 】

  2. 简单概括题目的意思:按照给定的规则[规则题目已经给规定好了],看字符串s是否可以匹配字符串p,如果可以的话,直接返回true,否则,返回false。

  3. 这个题目和通配符匹配最大的不同就在于,通配符匹配问题的’*‘可以匹配任意字符,而这道题目的’*'只可以匹配匹配零个或多个前面的那一个元素。弄明白这个区别,那么这道题就迎刃而解了。

  4. 具体匹配过程如下:

  5. 第一种情况,如果两个字符相同,或者模式串当前是’*'.,则匹配成功,然后继续递归比较i+1和j+1 ;

  6. 第二种情况:如果模式串后面跟了"",这又分为两种情况:
    (1)如果arr1[i]和arr2[j]相等(比如aa和a*这种情况),选择匹配前一个字符的零次,也就是直接忽略a
    ,从i和j+2继续递归;当然也可以匹配前一个继续的多次,先将字符串中的a忽略掉,继续递归i+1和j继续向后判断;
    (2)如果arr1[i]和arr2[j]不等(比如aa和b这种情况),则将b忽略掉,继续递归比较i和j+2的过程;

  7. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码
class Solution {
    public boolean isMatch(String s, String p) {
        char[] arr1=s.toCharArray();
        char[] arr2=p.toCharArray();
        return process(0,0,arr1,arr2);
    }

    public boolean process(int i,int j,char[] arr1,char[] arr2){
        if(j>=arr2.length) return i>=arr1.length;
        boolean flag=false;
        if(j+1<arr2.length&&arr2[j+1]=='*'){
            if(i<arr1.length&&(arr1[i]==arr2[j]||arr2[j]=='.')){
                flag|=process(i+1,j,arr1,arr2)|process(i,j+2,arr1,arr2);
            }else{
                flag|=process(i,j+2,arr1,arr2);
            }
        }else{
            if(i<arr1.length&&(arr1[i]==arr2[j]||arr2[j]=='.')){
                flag|=process(i+1,j+1,arr1,arr2);
            }
        }
        return flag;
    }
}
🥦 运行结果

时间复杂度
在这里插入图片描述

空间复杂度
在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路
  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。
🥦 实现代码
class Solution {

    int[][] dp;

    public boolean isMatch(String s, String p) {
        char[] arr1=s.toCharArray();
        char[] arr2=p.toCharArray();
        int m=arr1.length,n=arr2.length;
        dp=new int[m+1][n+1];
        for(int i=0;i<=m;i++) Arrays.fill(dp[i],-1);
        return process(0,0,arr1,arr2);
    }

    public boolean process(int i,int j,char[] arr1,char[] arr2){
        if(j>=arr2.length) return i>=arr1.length;
        if(dp[i][j]!=-1) return dp[i][j]==1;
        boolean flag=false;
        if(j+1<arr2.length&&arr2[j+1]=='*'){
            if(i<arr1.length&&(arr1[i]==arr2[j]||arr2[j]=='.')){
                flag|=process(i+1,j,arr1,arr2)|process(i,j+2,arr1,arr2);
            }else{
                flag|=process(i,j+2,arr1,arr2);
            }
        }else{
            if(i<arr1.length&&(arr1[i]==arr2[j]||arr2[j]=='.')){
                flag|=process(i+1,j+1,arr1,arr2);
            }
        }
        dp[i][j]=flag?1:0;
        return flag;
    }
}
🥦 运行结果

通过缓存,将重复计算的结果缓存下来,通过。
时间情况
在这里插入图片描述

空间情况
在这里插入图片描述


⚡ 动态规划

🥦 求解思路
  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。
🥦 实现代码
class Solution {

    boolean[][] dp;

    public boolean isMatch(String s, String p) {
        char[] arr1=s.toCharArray();
        char[] arr2=p.toCharArray();
        int m=arr1.length,n=arr2.length;
        dp=new boolean[m+1][n+1];
        dp[m][n]=true;
        for(int i=m;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                boolean flag=false;
                if(j+1<arr2.length&&arr2[j+1]=='*'){
                    if(i<arr1.length&&(arr1[i]==arr2[j]||arr2[j]=='.')){
                        flag|=dp[i+1][j]|dp[i][j+2];
                    }else{
                        flag|=dp[i][j+2];
                    }
                }else{
                    if(i<arr1.length&&(arr1[i]==arr2[j]||arr2[j]=='.')){
                        flag|=dp[i+1][j+1];
                    }
                }
                dp[i][j]=flag;
            }
        }
        return dp[0][0];
    }
}
🥦 运行结果

动态规划搞定,大家可以积极的尝试。

时间复杂度
在这里插入图片描述

空间复杂度
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

8. Spring Ai之入门到精通(超级详细) Spring AI 1.0.0 M1里程碑版本发布,标志着 Java 终于踏进Ai的时代半只脚。 阅读详情

相关推荐

ESP32-CAM图像糊成马赛克?OV2640参数调优保姆级教程(亮度/对比度/饱和度)

本文提供了一份详细的ESP32-CAM图像调优教程,针对OV2640摄像头常见的图像模糊问题,从分辨率设置、亮度/对比度/饱和度调整到高级寄存器配置,帮助用户优化网页显示画质。通过代码示例和实用技巧,解决马赛克、色彩暗淡等问题,提升摄像头性能。

weixin_30410119的博客 590

LeetCode高频题10:正则表达式匹配

1)本题中,'.' 匹配任意单个字符,点可以单独出现,'*' 匹配零个或多个前面的那一个元素,星必须配合前面一个字符使用,不能单独出现 2)最重要的是f尝试从s的si--N-1上尽量让pattern从pi--M-1上匹配出来,主要看pi和pi+1处的点与星的状况,区分好,区分清楚才能写出来,然后改记忆化搜索代码 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。............

weixin_46838716的博客 1488

PowerBI参数化实战:3分钟搞定动态数据源切换(附常见错误排查)

本文详细介绍了PowerBI参数化实战技巧,教你3分钟实现动态数据源切换。通过创建参数、改造查询和测试切换三步,轻松应对多环境部署与团队协作中的路径问题,并附上常见错误排查指南,有效提升报表的可维护性和工作效率。

p1q2r的博客 585

Leetcode-10.正则表达式匹配(暴力 或 记忆暴力)

表示:从s的第i个字符开始的后缀s[i:],是否能匹配模式串从第j个字符开始的后缀p[j:]。也就是把原来的变成了带下标版本的。

2504_93605592的博客 957

华大 HC32F460 DMA数据传输实战:从配置到中断处理的完整指南

本文提供了华大半导体HC32F460微控制器DMA(直接内存访问)功能的完整实战指南。详细解析了DMA的配置流程、中断处理机制以及软件与硬件触发方式,并附有实验代码示例。通过合理使用DMA进行数据传输,可以显著解放CPU资源,提升嵌入式系统的实时性与运行效率。

weixin_29194255的博客 251

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.csdn.net/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

力扣热题100实战 | 第10期:正则表达式匹配——动态规划的巅峰之作

本文是力扣热题100实战系列的第十篇,深度解析**正则表达式匹配**这道经典困难题。作为LeetCode第10题,它是动态规划领域最具挑战性的题目之一,也是大厂面试中区分度极高的压轴题。题目要求实现支持`.`和`*`的正则表达式匹配,其中`.`匹配任意单个字符,`*`匹配零个或多个前面的字符。本文从递归暴力解法讲起,分析其指数级复杂度的原因,然后逐步引出记忆化搜索优化,最终给出动态规划的核心解法。通过图解状态转移表和详细代码注释,帮助读者理解如何定义DP状态、推导转移方程、处理边界条件。无论你是正在备战20

LinuxSRE、k8s、运维、DBA、大数据 979

Day 01: 与Python的第一次亲密接触

环境搭建 、第一个程序 Hello, World!、以及Python之禅 (The Zen of Python) 的解读。

杨小扩的博客 220

正则从后向前匹配_深度解析正则表达式匹配:从暴力解法到动态规划

点击蓝色“五分钟学算法”关注我哟加个“星标”,一起学算法今天分享的题目来源于 LeetCode 上第 10 号问题:正则表达式匹配。题目难度为 Hard,目前通过率为 23.9% 。温馨提示:本题目有点难,干货有点干,建议先收藏后再仔细阅读。题目描述给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和'*' 的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个或多...

weixin_39787628的博客 816

基于matlab不变矩的数字验证码识别系统

随着互联网技术的快速发展和应用,网络给人们提供了丰富的资源和极大的便利,但随之而来的是互联网系统的安全性问题,而验证码正是加强 Web 系统安全性的产物。全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,CAPTCHA)也是验证码的一个应用程序,可以区分用户是人类还是计算机智能单击对象。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 916

CloudCompare 二次开发(17)——点云添加均匀分布的随机噪声

使用CloudCompare编程实现点云添加随机噪声。

点云侠的博客 839

Leetcode 10:正则表达式匹配(最详细的解法!!!)

给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符。 '*' 匹配零个或多个前面的元素。 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。 示例 1: 输入: s = &amp;amp;amp;amp;quot;aa&amp;amp;amp;amp;quot;

coordinate的博客 9316

python基于pingouin统计分析:rm_corr计算两个变量之间的重复测量相关性(Repeated measures correlation、plot_rm_corr函数可视化重复测量相关性图

python基于pingouin包进行统计分析:使用rm_corr函数计算两个变量之间的重复测量相关性(Repeated measures correlation)、plot_rm_corr函数可视化重复测量相关性图

statistics+insight+vista+power 679

暴力递归转向动态规划

你可以看到上面有很多 sbeg + 1, pbeg + 2 这种运算,这些值算出来很有可能相等,那么对于同一个 helper(s, 4, p, 5) 这种函数,可能会调用了多次。这里我的 map 使用 vector 来代替,大小是 (s.size() + 1) * (p.size() + 1) 的大小,每次取值时,通过 getIndex 来找出 vector 中对应的位置下标。逆着遍历,因为你看到了,我们的终止条件在 dp[s.size()][p.size()] 处。这样,我们就得到了完整的动态规划代码。

Rorschach的博客 373

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

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

记忆化搜索

记忆化搜索是一种结合递归与动态规划的算法优化技术,通过缓存子问题的解来避免重复计算,从而显著降低时间复杂度。其核心适用场景包括:具有递归定义和子问题重叠的问题(如斐波那契数列)、区间DP类问题(如矩阵链乘法)、状态转移复杂的问题(如背包变种)、路径/网格问题(如不同路径)、组合计数问题(如零钱兑换)以及博弈问题(如石子游戏)。典型实现步骤为:定义递归函数→添加备忘录缓存→递归前检查缓存→返回前存储结果。通过力扣例题(如509、62、300、375、329题)的解法演变,展示了从暴力搜索到记忆化搜索再到动态规

Small_entreprene的博客 1284

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

leetcode正则表达式匹配(暴力,动态规划)

题目 链接:leetcode 10题正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 ...

qq_40931241的博客 313

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode 10. Regular Expression Matching【正则表达式匹配】

文章目录题目描述结果记忆化搜索结果动态规划结果我的记忆化搜索代码网络的题目解析解法一:递归暴力求解解法二:记忆化搜索解法三:动态规划反思参考资料 题目描述 结果 记忆化搜索结果 动态规划结果 我的记忆化搜索代码 我是看了很多个测试用例才过的题,以后要改改,不能看测试用例了,机试的时候才不会告诉你测试用例呢!需要警醒!!! //我的想法是记忆化搜索 //首先是DFS,然后DFS里面引入记忆...

yc_cy1999的博客 515

LeetCode高频题44. 通配符匹配

1)关键要分清pi的状况,看看能否从pi--M-1上优化出s的si--N-1来,搞清楚base case,和各种可能的情况就好办了 2)暴力递归就是一种很好的尝试,本题还需要改记忆化搜索算法,然后优化精细化DP,有枚举行为,直接优化,老牛逼了! 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。 ......

weixin_46838716的博客 667

动态规划之正则表达式匹配字符串

解题框架:【README1】动态规划之解题思路 文章目录题目解题思路动态规划CODE 题目 LeetCode10:正则表达式匹配 解题思路 正则表达式的匹配规则我在这里就不多说了,相信大家都很清楚。 本题会给出两个字符串s和p,p代表的是模式串,也就是带有正则表达式的那个字符串,判断p是否可以匹配字符串s .号很好实现,遇到它直接匹配就可。难点就在于*,因为一旦出现 *号,它前面的字符可以出现1次,也可以出现n次,也可以不出现。比如.a*b就可以匹配zaaab 关于字符串的撇匹配,大家首先想到的肯.

快乐江湖的博客 920

深度解析 LC 10. Regular Expression Matching

导言 这篇文章主要目的是解析 LeetCode 上面的一道经典动态规划问题,Regular Expression Matching,但这里还会讲解暴力搜索、记忆化搜索,以及面对字符串类的动态规划问题该如何更好地切题 题目分析 LeetCode 10. Regular Expression Matching 这道题其实是要实现 Regular Expression 里面的两个符号,一个是 '....

weixin_30896763的博客 227

[特殊字符] 第84课:正则表达式匹配

这篇文章围绕正则表达式匹配这道算法题展开,梳理解题思路、关键数据结构与复杂度分析,并补充实现时需要注意的边界处理和常见陷阱,适合刷题复盘、面试准备以及快速回顾标准解法。

丨汀、的博客 429

【Leetcode】随笔

🌈🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨。

种一棵树,最好的时间是十年前,其次是现在。 762

算法数据结构——记忆化搜索(Memoization Search)从入门到实战:核心原理与高频面试题精讲

本文深入解析记忆化搜索(Memoization Search)的核心原理与实战应用,从暴力递归优化到高效算法。通过斐波那契数列、零钱兑换等经典案例,详解如何通过缓存计算结果降低时间复杂度,并对比记忆化搜索与动态规划的异同。文章还提供万能四步法框架和高频面试题精讲,帮助读者掌握这一关键算法技巧。

weixin_30367873的博客 167

【Hard——Day6】41.缺失的第一个正数、42.接雨水、44.通配符匹配

和解法二的前后缀分解法有点像。确实是一样的解法,不过这边配合图解释了一下,就把解法二没懂的部分给看懂了。这里面也写了四种方法,分别是dfs从后往前匹配法、二维数组动态规划法、一维数组动态规划法。有点无语,代码太短了而且和前面的解法一样。这题和10.正则表达式匹配是不是同一题啊。解法一:贪心、递归、记忆化搜索、字符串。和解法二的双指针是一个解法。解法二:记忆化搜索、动态规划。解法三:动态规划、字符串匹配。解法二:数组、哈希表、暴力。41.缺失的第一个正数。41.缺失的第一个正数。解法一:数组、双指针。

Blueekyyy 783

wagmi `getClient` Action 详解:获取 Viem Client 实例的完整指南

`getClient` 是 wagmi Core 提供的核心 Action,用于获取当前配置(`Config`)对应的 Viem [`Client`](https://viem.sh/docs/clients/custom) 实例。在本仓库(wagmi monorepo)中,它是所有底层链上操作(读合约、发交易、查余额、估 Gas 等)的公共起点,正确理解它的参数、返回类型与底层缓存机制,能帮助你

gitblog_00529的博客 428

Leetcode-动态规划

70. 爬楼梯https://leetcode-cn.com/problems/climbing-stairs/ 假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定n是一个正整数。 解: 暴力,如果只有一阶,就只有一种方法;如果只有二阶,就只有两种方法。那么n阶的方法数就等于n-1阶和n-2阶...

albyc22660的专栏 194
上一篇: 【LeetCode: 44. 通配符匹配 | 暴力递归=>记忆化搜索=>动态规划 】
下一篇: 【LeetCode: 面试题 17.24. 最大子矩阵 | 动态规划 】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

硕风和炜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值