导读:算法哥前面分享了一个《通配符匹配》,有粉丝留言,算法哥你再讲讲leetcode上另一道《正则表达式匹配》,正则表达式匹配这道题是前面通配符匹配的加强版,大家一起来学习吧!

题目描述

给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符。'*' 匹配零个或多个前面的元素。

匹配应该覆盖整个字符串 (s) ,而不是部分字符串。

题目来源:LeetCode 10:Regular Expression Matching

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

示例 1:

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

示例 2:

输入:s = "aa"p = "a*"输出: true解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。

示例 3:

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

示例 4:

输入:s = "aab"p = "c*a*b"输出: true解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。

示例 5:

输入:s = "mississippi"p = "mis*is*p*."输出: false

题目分析

这道题目已经有正则表达式的意思在里面了,.表示任意字符,*表示零个或多个前面的元素。这道题目和突破LeetCode,拿BAT大厂offer之《通配符匹配》(动态规划)的区别在于,前者的*只是表示任意字符串,后者表示零个或者多个前面的元素。


我们还是和前面一道题同样的思路,令dp[i][j]表示字符串s前i个字符和模式串p的前j个字符的匹配情况,匹配等于1,不匹配等于0

那么我们怎么根据dp数组记录的状态进行状态转移呢?也就是说dp[i][j]可以由哪些状态递推过来呢?我们一起来看图吧!

情形1:

显然绿色位置已经匹配,所以dp[1][1]=1,我们考察红色的位置,也就是dp[2][2],此时因为s[2]=p[2],且dp[1][1]=1,所以显然dp[2][2]=1;

情形2:

绿色部分表示已经匹配了,此时dp[10][9]=1,此时p[10]=.,s[11]=i,因为.匹配任意字符,所以dp[11][10] = 1;

情形3:

大家注意到图片里新增加了下标0,目的是说明dp[0][0]=1,且dp[0][2]等于什么呢?,哈哈此时p[2]=*,重复0次,是不是dp[0][2]=1!注意这个情形哦,不然样例4就解释不过了!

情形4:

此时dp[1][3]=1,那dp[1][4]等于什么呢?因为p[4]=*,重复一次,dp[1][[4]=1.


总结一下:

  1. 情形1和情形2对应了由dp[i-1][j-1]推导dp[i][j];
  2. 情形3对应了由dp[i][j-2]推导dp[i][j];
  3. 情形4对应了由dp[i][j-1]推导dp[i][j];

聪明的读者肯定注意到了那dp[i-1][j]推导dp[i][j]呢?这个就留给读者自己思考吧,读者也可以对照算法哥给出的源码自己画图推导!

上源码:

源码


复杂度分析

两层for循环,时间复杂度是O(mn)的,m表示字符串s的长度,n表示模式串p的长度;空间复杂度是O(mn)的,这里依然可以用滚动数组优化到O(n),不会的同学就翻算法哥以前的文章吧!


题目总结

这个题目比前面的《通配符匹配》难度上要大一点,状态转移如果不能抓住问题的本质,还是有一定难度的,通过这个题目,相信大家对算法哥说的大问题转化为小问题,小问题推导大问题又有了新的认识吧!


题目分享完毕,请帮助算法哥上头条吧,您的关注,转发,点赞,评论,都是对算法哥最大的鼓励!

通配符?子字符串匹配主字符串次数_突破LeetCode,拿BAT大厂offer之《正则表达式匹配》(动态规划)...相关推荐

  1. 通配符?子字符串匹配主字符串次数_leetcode 44 通配符匹配(c++)

    ### 题目 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符 ...

  2. 字符串转换成整数,带通配符的字符串匹配

    之前本一直想写写神经网络算法和EM算法,但写这两个算法实在需要大段大段的时间,而平时上班,周末则跑去北大教室自习看书(顺便以时间为序,说下过去半年看过的自觉还不错的数学史方面的书:<数理统计学简 ...

  3. 字符串转换成整数,通配符的字符串匹配问题

    http://blog.csdn.net/v_july_v/article/details/9024123#comments 前言 之前本一直想写写神经网络算法和EM算法,但写这两个算法实在需要大段大 ...

  4. 字符串匹配:字符串中查找某子串

    字符串匹配:字符串中查找某子串 需求 具体算法 常规方法 程序 KMP算法 程序 后续 需求 我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法.而目前常用的字符串匹配算法有很多, ...

  5. java indexof 通配符,字符串与含有通配符‘*’的字符串匹配(非正则表达式)

    顺利找到工作之后,每天勤勤恳恳的上班中... 项目需要搜索含有通配符的文件名的文件,*号表示任意多字符.这里应该只处理英文. 如此简单的要求,还是不要用正则表达式,一是简单,而是正则表达式感觉杀鸡用了 ...

  6. 【Python】python通配符,使用通配符进行字符串匹配

    文章目录 1. 常用通配符 2. fnmatch模块 2.1 fnmatch函数 2.2 fnmatchcase函数 1. 常用通配符 符号 用法 * 代替零.一或多个字符 ? 代替任意一个字符 [a ...

  7. 字符串匹配(字符串变为大写或小写)

    字符串变为大写或小写 #include<stdio.h> #include<string.h> int main(){char a[]={'a','B','c','!','\0 ...

  8. js 字符串替换_正则精要:玩转JS正则表达式,也许只需这一篇(建议收藏)

    0.导引 在正文开始前,先说说正则表达式是什么,为什么要用正则表达式?正则表达式在我个人看来就是一个程序可以识别的规则,有了这个规则,程序就可以帮我们判断某些字符是否符合我们的要求.但是,我们为什么要 ...

  9. python带通配符的字符串匹配_Bash技巧:实例介绍数个参数扩展表达式以处理字符串变量...

    Linux 的 bash shell 提供了多种形式的参数扩展表达式,可以获取变量自身的值,或者对变量值进行特定处理得到一个新的值,等等. 本篇文章对字符串变量值相关的参数扩展表达式进行汇总说明. 假 ...

最新文章

  1. leetcode--最长公共前缀--python
  2. Windows mobile UI
  3. 《Spring Cloud微服务实战》100本赠书获得名单
  4. 迟到两年,Lu1与Cee合作的经典单曲《自己做决定》终于发布MV了!
  5. net 快速打印日志
  6. geotif 添加坐标_python – 如何获取geotif中单元格的坐标?
  7. Outlook 与 Outlook Express 的区别
  8. 从java的NIO版hello world看java源码,我们能看到什么?
  9. google浏览器打开关闭标签
  10. 牛市买基金好还是股票好?买基金会翻倍吗?
  11. ~~spfa 算法(队列优化的Bellman-Ford算法)(附模板题)
  12. [译] 深入理解 JavaScript 事件循环(二)— task and microtask
  13. delphi下载网站文件(支持https协议)
  14. 【scratch高阶案例教学】scratch斐波那契数列 scratch创意编程 少儿编程 小朋友们也可以完成如此神奇的数列
  15. 几种常见的归一化方法
  16. iOS面试题:Socket原理
  17. 嘉楠科技被「华尔街」看空
  18. linux配置mac地址命令是什么,Linux环境下如何配置IP地址、MAC地址
  19. Java如何解决模糊查询(数据库SQL语句,报表开发工具)
  20. 史上最全APP推广渠道

热门文章

  1. Covariance and Contravariance in C#的搜索条件
  2. 字节二面:GET 请求能上传图片吗?我蒙了。。
  3. 为什么你老是讲不清楚js的继承模式
  4. 在阿里当PM都需要做什么?
  5. 进程和线程基础知识全家桶,30 张图一套带走
  6. 设计模式在外卖营销业务中的实践
  7. Redis史上最强【集群】入门实践教程
  8. 45本程序员圣经级别书籍,包邮送到家!
  9. 分库分表架构实践(文末送书)
  10. 介绍一个团队协同管理工具:Leangoo