正则表达式匹配

简介: 正则表达式匹配

公众号merlinsea


链接

https://leetcode.cn/problems/regular-expression-matching/

640.png


解题思路

如果 p[j+1] == *

   Char ch = p[j]

   If ch==. 取决于p[0,j-1] s[0,i-1]是否匹配 

   If ch!=. 取决于p[0,j] s[0,i]是否匹配  p[j+1]==s[i+1]

   匹配0个元素  p[0,j] s[0,i+1]是否匹配


如果 p[j+1] == .

当前匹配情况取决于之前的元素是否匹配---->p[0,j+1]匹配s[0,i+1]


如果 p[j+1] == 英文字符

当前匹配情况取决于之前的元素是否匹配且当前元素是否相等----p[j+1]==s[i+1]


题目初步计算求解过程

640.png640.png


原题的进阶理解过程:

640.png640.png


解题代码


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,false));
        dp[0][0] = true;
        for(int j=1;j<=n;j++){
            if(p[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[j-1]=='.'){
                    dp[i][j] = dp[i-1][j-1];
                }else if(p[j-1]=='*'){
                    //回退一个字符
                    bool flag1 = dp[i][j-2];
                    //匹配0个元素字符
                    bool flag2 = dp[i][j-1];
                    //ch表示前面是什么字符
                    char ch = p[j-2];
                    //*代表重复元素
                    bool flag3 = false;
                    if(ch == '.'){
                        flag3 = dp[i-1][j-1] || dp[i-1][j];
                    }else if(ch != '*'){
                        flag3 = (dp[i-1][j-1]|| dp[i-1][j]) && (s[i-1]==ch);
                    }else{
                        //当前字符是*
                        flag3 = dp[i][j-1];
                    }
                    dp[i][j] = flag1 || flag2 || flag3;
                }else{
                    if(p[j-1]==s[i-1]){
                        dp[i][j]=dp[i-1][j-1];
                    }
                }
            }
        }
        return dp[m][n];
    }
};


关于leetcode算法训练营:

   加我微信号私聊参加训练营~

本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步

奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!


相关文章
正则表达式匹配
【10月更文挑战第8天】
|
6月前
|
Java
正则表达式匹配数字的几种方法比较
正则表达式匹配数字的几种方法比较
|
6月前
10.正则表达式匹配
10.正则表达式匹配
|
7月前
|
JavaScript
10. 正则表达式匹配
10. 正则表达式匹配
46 0
|
新能源 Java Linux
你必须掌握的常用正则表达式大全
你必须掌握的常用正则表达式大全
1535 1
你必须掌握的常用正则表达式大全
|
算法 前端开发 程序员
实现正则表达式匹配算法
实现正则表达式匹配算法
实现正则表达式匹配算法
正则表达式——常用的匹配规则
简介:正则表达式——常用的匹配规则
正则表达式——常用的匹配规则
|
C#
C#正则表达式的完全匹配、部分匹配及忽略大小写的问题
原文:C#正则表达式的完全匹配、部分匹配及忽略大小写的问题 问题的提出 根据用户给定表达式,里面含有各种数学函数,如求绝对值,三角函数,平方、开方等,分别以类似ABS(表达式),Sin(表达式),ASin(表达式),POW(表达式)等形式表述。
2023 0
|
数据安全/隐私保护
20几个正则常用正则表达式
原文:20几个正则常用正则表达式   知道这几 个正则表达式,能让你少写 1,000 行代码,废话不多说了,直接上代码     正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码:var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date format error!'); 下面是技匠整理的,在前端开发中经常使用到的20个正则表达式。
1663 0