LeetCode10. 正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

说明:

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

输入:
s = "aa"
p = "a"
输出: false

思路

跟《剑指offer》正则表达式匹配的题目一样

首先,考虑特殊情况:
         1>两个字符串都为空,返回true
         2>当第一个字符串不空,而第二个字符串空了,返回false(因为这样,就无法匹配成功了,而如果第一个字符串空了,第二个字符串非空,还是可能匹配成功的,比如第二个字符串是“a*a*a*a*”,由于‘*’之前的元素可以出现0次,所以有可能匹配成功)

之后就开始匹配第一个字符,这里有两种可能:匹配成功或匹配失败。但考虑到p下一个字符可能是‘*’, 这里我们分两种情况讨论:p下一个字符为‘*’或不为‘*’:
          1>p下一个字符不为‘*’:这种情况比较简单,直接匹配当前字符。如果匹配成功,继续匹配下一个;如果匹配失败,直接返回false。注意这里的“匹配成功”,除了两个字符相同的情况外,还有一种情况,就是p的当前字符为‘.’,同时s的当前字符不为‘\0’。
          2>p下一个字符为‘*’时,稍微复杂一些,因为‘*’可以代表0个或多个。 这里把这些情况都考虑到:
               a>当‘*’匹配0个字符时,s当前字符不变,p当前字符后移两位,跳过这个‘*’符号;
               b>当‘*’匹配1个或多个时,str当前字符移向下一个,p当前字符不变。(这里匹配1个或多个可以看成一种情况,因为:当匹配一个时,由于s移到了下一个字符,而p字符不变,就回到了上边的情况a;当匹配多于一个字符时,相当于从str的下一个字符继续开始匹配)

class Solution {
public:bool isMatch(string s, string p) {return judge(s, p, 0, 0);}
private:bool judge(string &s, string &p, int i, int j){if(s[i]=='\0'&&p[j]=='\0') return true;if(s[i]!='\0'&&p[j]=='\0') return false;if(p[j+1]!='*'){if(s[i]==p[j] || (s[i]!='\0'&&p[j]=='.')) return judge(s, p, i+1, j+1);else return false;}else{if(s[i]==p[j] || (s[i]!='\0'&&p[j]=='.')) return judge(s, p, i, j+2) || judge(s, p, i+1, j);//匹配0个或多个 else return judge(s, p, i, j+2);}}
};

LeetCode10. 正则表达式匹配相关推荐

  1. LeetCode10.正则表达式匹配 JavaScript

    给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不 ...

  2. leetcode10. 正则表达式匹配 一道没有解释的字符串dp困难题

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串  ...

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

    解题框架:[README1]动态规划之解题思路 文章目录 题目 解题思路 动态规划 CODE 题目 LeetCode10:正则表达式匹配 解题思路 正则表达式的匹配规则我在这里就不多说了,相信大家都很 ...

  4. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册

    前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...

  5. Oracle正则表达式匹配中文的问题

    查资料知道中文Unicode范围是\u4e00 - \u9fa5 可是自己用来正则表达式匹配中文总是用不了Unicode.最简单举例: select regexp_replace('abc秋歌def' ...

  6. python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构

    unutbu.. 14 编辑: falsetru的嵌套解析器,我稍微修改为接受任意正则表达式模式来指定分隔符和项目分隔符,比我原来的re.Scanner解决方案更快更简单: import re def ...

  7. 剑指offer:面试题19. 正则表达式匹配

    题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹 ...

  8. 使用正则表达式匹配HTML 下各种title标签

    http://www.oschina.net/question/195686_46313 <title>标题</title> <title> 标题 </tit ...

  9. 刻意练习:LeetCode实战 -- Task18. 正则表达式匹配

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

最新文章

  1. Apache网页优化之网页压缩
  2. 【Java基础】重写与重载
  3. 成功解决IndexError: arrays used as indices must be of integer (or boolean) type
  4. [0715]Jsoi Test elevator
  5. kali下sqliv:SQL注入URL扫描器
  6. 如何使用Instruments诊断App(Swift版):起步
  7. 浅拷贝+引用计数--写时拷贝---模拟实现string容器
  8. AcWing之找出数组中重复的数字
  9. Python基础--环境配置、编码风格、基础概念、基本数据类型(1)
  10. java之的读取文件大全
  11. 正定矩阵和半正定矩阵
  12. 林期苏曼属性标签编辑_标签制作软件如何制作椭圆形药品标签
  13. 真正决定人生高度的,是你做事的速度
  14. java中接口(interface)及使用方法和注意事项
  15. 网吧免费上网的7种武器
  16. C#,深度好文,精致好码,文本对比(Text Compare)算法与源代码
  17. 前端面试题之浏览器系列
  18. MC34063A MC34063 贴片SOP-8 变换器控制芯片 电流0.8A 1.2A 1.5A
  19. 压缩为王-阿里第五届中间件复赛总结
  20. 在线教育项目技术笔记1

热门文章

  1. 大数据_Hbase-分布式介绍_分布式发展历程_去中心化_客户端负载均衡_服务器端负载均衡---Hbase工作笔记0001
  2. oracle数据库异常---SP2-1503: 无法初始化 Oracle 调用界面 SP2-1503: 无法初始化 Oracle 问题的解决办法
  3. powerdesigner连接mysql,并导出其数据模型的方法
  4. Java中String连接性能的分析
  5. zeromq+python安装手册
  6. xmlDocument来操作xml文档
  7. docker源码编译 linux_oracle linux 6 docker 安装(包括编译git源码)
  8. pythonweb自动化项目源码下载_python+requests接口自动化完整项目设计源码
  9. 基于51单片机电子时钟
  10. 10天智能锁项目实战第1天(了解单片机STM32F401RET6和C语言基础)