【LeetCode热题100】打卡第6天:正则表达式匹配

这篇具有很好参考价值的文章主要介绍了【LeetCode热题100】打卡第6天:正则表达式匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

正则表达式匹配

⛅前言

大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。

博客主页💖:知识汲取者的博客

LeetCode热题100专栏🚀:LeetCode热题100

Gitee地址📁:知识汲取者 (aghp) - Gitee.com

Github地址📁:Chinafrfq · GitHub

题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激

🔒题目

原题链接:10. 正则表达式匹配 - 力扣(LeetCode)

【LeetCode热题100】打卡第6天:正则表达式匹配

🔑题解

  • 解法一:正则表达式

    这里标记是困难,但是如果使用正则表达式一行代码就解决了,但是这题的作者可能并不是想要我们使用正则表达式,而是使用动态规划,如果使用动态规划这题难度直接上升几个等级。所以大家不要为了做题而做题,而是去学习了解更多的算法思路,有时候我们不需要去把一个题给AC了,而是要做到,看到一个题能够第一时间直到这题考察的内容,应该使用哪种算法策略,毕竟现在AI这么流行,直接把一个题交给AI,他立马能够给你解答。

    当然这题使用正则也不赖,也是一种比较优秀的解法,但是却无法锻炼到我们的逻辑思维,因为太简单了🤣正则表达式YYDS

    import java.util.regex.Pattern;
    
    class Solution {
        public boolean isMatch(String s, String p) {
            return Pattern.matches(p, s);
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n),正则匹配本质是
    • 空间复杂度: O ( 1 ) O(1) O(1)

    其中 n n n 为字符串的长度

  • 解法二:动态规划

    本段代码来自这位大佬的:fomalhaut1998 - 力扣(LeetCode)

    class Solution {
        public boolean isMatch(String s, String p) {
            /*
            dp五部曲:
            设主串s的长度为m,设模式串p的长度为n;其中s只有小写字母,p有字母/./*
            1.状态定义:dp[i][j]为考虑s[0,i-1]与p[0,j-1]是否能匹配上,能匹配上就为true
            2.状态转移:若要求dp[i][j]就必须考虑到s[i-1]与p[j-1]
                2.1 当p[j-1]不是'*'时
                    2.1.1 若s[i-1]==p[j-1]时,即p[j-1]为'a'-'z'且与s[i-1]相等,看dp[i-1][j-1]
                    2.1.2 p[j-1] == '.'时,直接将'.'变成s[i-1],看dp[i-1][j-1]
                    注意:这里的'.'是匹配一个字符,而不是一连串,如"a.b"->"axb"
                2.2 当p[j-1]是'*'时,主要看p[j-2]做判断
                    2.2.1 p[j-2]为'a'-'z'并且p[j-2]==s[i-1],那么此时s继续往前看,p暂时不动
                        即:看dp[i-1][j]
                    2.2.2 p[j-2]为'.',那么".*"可以变为"....."可以匹配s[i-1]前面的任何字符(万能串)
                        因此,直接看dp[i-1][j](或者直接返回true)
                    2.2.3 剩下的就是p[j-2]为'a'-'z'且p[j-2]!=s[i-1],那么此时p的"x*"作废,看dp[i][j-2]
                这里:2.1.1与2.2.2可以看成一种情形:即s与p均前移一位
                    2.2.1与2.2.2可以看成一种情形:即p不动s前移一位
            3.初始化:
                3.1 空的s
                    3.1.1 空的p,空的s可以匹配空的p,因此dp[0][0]=true
                    3.1.2 非空的p,空的s可能可以匹配非空的p,例如"a*",因此需要经过转移计算
                3.2 空的p
                    3.2.1 空的s,同3.1.1
                    3.2.2 非空的s,空的p不可能匹配非空的s,因此dp[i][0]=false,i∈[1,m]
                3.3 非空的s与非空的p:需要经过转移计算
                其中:3.1.1与3.2.2可以合并为dp[i][0]=i==0
            4.遍历顺序:显然是正序遍历
            5.返回形式:返回dp[m][n]就是考虑s[0,m-1]与p[0,n-1]是否能匹配上
            */
            int m = s.length(), n = p.length();
            boolean[][] dp = new boolean[m + 1][n + 1];
            // 初始化dp[i][0]
            // for(int i = 0; i <= m; i++) {
            //     dp[i][0] = i == 0;
            // }
            dp[0][0] = true;
            // i从0开始
            for(int i = 0; i <= m; i++) {
                // 注意j从1开始
                for(int j = 1; j <= n; j++) {
                    if(p.charAt(j - 1) != '*') {
                        // 1.当p[j-1]不是'*'时(注意j已经从1开始了)
                        // 这里要注意运算优先级问题(加括号)
                        if(i >= 1 && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.')) {
                            // s与p均前移一位
                            dp[i][j] = dp[i - 1][j - 1];
                        }
                    } else {
                        // 2.当p[j-1]是'*'时,主要看p[j-2]做判断
                        if(j >= 2 && i >= 1 && 
                        (p.charAt(j - 2) == s.charAt(i - 1) || p.charAt(j - 2) == '.')) {
                            // 看"x*":p不动s前移一位
                            dp[i][j] = dp[i - 1][j];
                        }
                        // 不看"x*":
                        // 剩下的为p[j-2]为'a'-'z'且p[j-2]!=s[i-1],那么此时p的"x*"作废,看dp[i][j-2]
                        if(j >= 2) {
                            dp[i][j] |= dp[i][j - 2];
                        }
                        // 这里的|=表示只要满足了其中一个条件就可以使得dp[i][j]==true
                        // 通俗一点的解释就是:当p[j-1]=='*'时,
                        // 若p[j-2]==s[i-1]||p[j-2]=='.',则dp[i][j]可以继承dp[i-1][j]:转移路径1
                        // 若p[j-2]!=s[i-1],则dp[i][j]可以继承dp[i][j-2]:转移路径2
                        // 满足任意一条转移路径就可以使得dp[i][j]=true
                    }        
                }
            }
            // 所求即为考虑s[0,m-1]与p[0,n-1]是否能匹配上
            return dp[m][n];
        }
    }
    

    详情参考官方代码

    复杂度分析:

    • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm)
    • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

    其中 n n n 为数组中元素的个数文章来源地址https://www.toymoban.com/news/detail-462752.html

到了这里,关于【LeetCode热题100】打卡第6天:正则表达式匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【正则表达式】正则表达式常见匹配模式

    模式 描述 w 匹配字母数字及下划线 W 匹配非字母数字下划线 s 匹配任意空白字符,等价于 [tnrf]. S 匹配任意非空字符 d 匹配任意数字,等价于 [0-9] D 匹配任意非数字 A 匹配字符串开始 Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 z 匹配字符串结

    2024年02月09日
    浏览(81)
  • 正则表达式 (用于灵活匹配文本的表达式)

    目录 . * 用于匹配任意单个字符,除了换行符。 例如使用正则表达式 a.b, 它可以匹配aab、acb、a#b 用于匹配前一个字符零次或多次。 例如,使用正则表达式 ab*c ,它可以匹配 \\\"ac\\\"、\\\"abc\\\"、\\\"abbc\\\",因为 b* 表示匹配零个或多个字符 \\\"b\\\"。所以,这个表达式可以匹配 \\\"ac\\\"(零个 \\\"b\\\"),

    2024年01月16日
    浏览(64)
  • Java 正则表达式匹配

    正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑和操作文本。 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/string),它会以定义的模式从左到右匹配文本,每个源字符只匹配一次。 正则表达式 匹配 this is text 精确匹配

    2024年02月06日
    浏览(63)
  • 正则表达式的神奇世界:表达、匹配和提取

    正则表达式,这个看起来像密林中的迷宫的工具,既神秘又令人着迷。它是编程世界中的一门魔法,有着神奇的能力。你是否曾经在寻找或解析文本时感到束手无策?或许你想要从海量数据中提取特定信息?这正是正则表达式可以派上用场的时候。本文将带你探索这个神奇的

    2024年02月07日
    浏览(64)
  • VSCode 正则表达式 匹配多行

    VS Code 正则表达式匹配多行 (.|n)*? 案例1: str(.|n)*?, 案例2: const(.|n)*?}$ 案例3: fn(.|n)*?},

    2024年02月02日
    浏览(49)
  • 【动态规划】通配符匹配与正则表达式匹配

    题目描述: 给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而

    2024年02月07日
    浏览(64)
  • 正则表达式的匹配(py编程)

    1. 匹配单个字符 在上一小节中,了解到通过re模块能够完成使用正则表达式来匹配字符串 本小节,将要讲解正则表达式的单字符匹配 代码 功能 . 匹配任意1个字符(除了n) [ ] 匹配[ ]中列举的字符 d 匹配数字,即0-9 D 匹配非数字,即不是数字 s 匹配空白,即 空格,tab键

    2024年02月02日
    浏览(77)
  • 正则表达式包含数字和字符匹配

    至少6位。 pattern : (?=. [0-9])(?=. [A-Za-z])[0-9A-Za-z]{6,} 正则表达式中的“?=”是一个正向预查字符,它的意思是匹配前一个字符出现的最少一次。具体来说,当一个匹配出现时,它会检查前一个字符是否符合要求,如果符合,则继续匹配下一个字符,否则停止匹配。

    2024年02月06日
    浏览(58)
  • 详解正则表达式匹配方法 match()

    在前端开发中,正则表达式是一大利器。所以我们这次就来讨论下match()方法。 match本身是JavaScript语言中字符串对象的一个方法,该方法的签名是 match([string] | [RegExp]) 它的参数既可以是一个字符串,也可以是一个正则表达式。该方法绝大多数都是要使用正则表达式的,所以参

    2024年02月11日
    浏览(50)
  • 剑指 Offer 19. 正则表达式匹配

    剑指 Offer 19. 正则表达式匹配 初始化要考虑主串为空字符串,模式串为 a*b*c* 的形式。 一般情况时,根据模式串是 普通字符 、 \\\'.\\\' 、 \\\'*\\\' 分情况考虑。为 \\\'*\\\' 时,考虑 匹配0次 和 匹配多次 的情况,匹配多次时要注意判断前提是能匹配。

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包