1 题目

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

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

2 思路

使用动态规划的方法, 开辟一个大小是(s_size + 1) * (p_size + 1)的二维数组Match, Match[i][j]代表着s的前i个字符和p的前j个字符是否匹配, 要获取Match[i][j]的值首先要观察s的第i个字符(s[i - 1])和p的第j个字符(p[j - 1])的关系.

如果s[i - 1] = p[j - 1]或者是p[j - 1]为' . ', 那么s的前i个字符和p的前j个字符是否匹配取决于s的前i - 1个字符和p的前j - 1个字符是否匹配.

如果不满足上述条件, 但是p[j - 1]为' * ', 那么就需要观察' * '前面的字符(p[j - 2])和s的第i个字符的关系:

  • 如果s[i - 1] = p[j - 2]或者是p[j - 2]为' . ', 也就是说, 假设匹配上的字符是a(p[j - 2] = a), 那么如果此时我们可以用任意个数的a加在p的前j-2个字符的后面看是否匹配, 那么此时我们不用一个一个枚举我们加了多少个a, 只需要枚举加了一个a还是不加a, 因为加了一个a的话就是看s的前i-1个字符跟p的前j-2个字符是否匹配, 它可以重复这个过程, 最终遍历所有情况, 不加a的话就是看s的前i个字符跟p的前j-2个字符是否匹配, 以上两种情况只要有一种满足匹配上就能保证s的前i个字符和p的前j个字符匹配得上, 所以可以进行抑或运算.
  • 如果p[j - 1]为' * ', 但是不满足上面的s[i - 1] = p[j - 2]或者是p[j - 2]为' . ', 那么*前面的字符就一个都不能用了, 只能用0个, 也就是说此时就只能看s的前i个字符跟p的前j-2个字符是否匹配.

所以代码如下:

bool isMatch(string s, string p) {int s_size = s.size();int p_size = p.size();vector<vector<int> > Match;for (int i = 0; i <= s_size; i ++) {vector<int> tmp;tmp.resize(p_size + 1);Match.push_back(tmp);}Match[0][0] = 1;for (int i = 0; i <= s_size; i ++) {for (int j = 1; j <= p_size; j ++) {if (i == 0) {//当i是0的时候,也就是说此时s一个字符也没有,如果此时p有字符, 那么每个字符后面//必须有*,代表着这些字符都是0个的时候才能匹配上,否则就匹配不上.Match[i][j] = p[j - 1] == '*' ? Match[i][j - 2] : 0;} else {if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {Match[i][j] = Match[i - 1][j - 1];} else if (p[j - 1] == '*') {if (s[i - 1] == p[j - 2] || p[j - 2] == '.') {Match[i][j] = Match[i - 1][j] | Match[i][j - 2];} else {Match[i][j] = Match[i][j - 2];}}}}}return Match[s_size][p_size];
}

leetcode 10 --- 正则表达式匹配相关推荐

  1. [动态规划] leetcode 10 正则表达式匹配

    [动态规划] leetcode 10 正则表达式匹配 1.题目 题目链接 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 ...

  2. Java实现 LeetCode 10 正则表达式匹配

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

  3. LeetCode 10. 正则表达式匹配(递归/DP)

    文章目录 1. 题目 2. 解题 2.1 递归 2.2 DP 1. 题目 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 ...

  4. LeetCode 10.正则表达式匹配(动态规划)

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

  5. LeetCode 10 正则表达式匹配

    https://leetcode-cn.com/problems/regular-expression-matching/ 解决方案 class Solution {public boolean is ...

  6. LeetCode精讲题 10正则表达式匹配(动态规划)

    标题 题目描述 递归(超时) 动态规划 结语 题目描述 先点赞再观看.帅哥靓女养成好习惯. 10 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和'*'的正则表达 ...

  7. LeetCode算法复健:10.正则表达式匹配

    10.正则表达式匹配 日期:2022/7/5 题目描述:给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或 ...

  8. 【LeetCode】正则表达式匹配

    https://www.imooc.com/article/281353?block_id=tuijian_wz [LeetCode]正则表达式匹配 2019.03.04 19:53 598浏览 题目 ...

  9. 文巾解题 10. 正则表达式匹配

    1 题目描述 2 解题思路 题目中的匹配是一个逐步匹配的过程:我们每次从字符串 p 中取出一个字符或者一个字符 & 星号的组合,并在 s 中进行匹配. 对于 p 中一个字符而言(包括字符.), ...

最新文章

  1. Oracle DBA学习互联网化的内容
  2. 阿里巴巴 Service Mesh 落地的架构与挑战
  3. tensorflow-Inception-v3模型训练自己的数据代码示例
  4. Java Script中常见操作
  5. 当电桥为恒流源时惠斯通电桥电压的计算方法
  6. 画验证曲线_数学老师用“函数曲线”绘出美图 学生舍不得擦
  7. Mantis安装过程笔记
  8. 面向对象特性、使用面向对象编程的场合
  9. undefined reference to `vtable for XXX‘
  10. 大数据 数据库 评测_中国信通院公布第九批大数据产品能力评测结果,65款产品通过...
  11. Android--BRVAH官方使用指南
  12. android 校验手机号码,检查Android中的有效手机号码
  13. 电压(电流)运算放大器为什么要增大(减小)输入阻抗?
  14. Ubuntu断点续存之wget
  15. css和html的用法,HTML与CSS之CSS的基本使用
  16. 用示波器抓取LIN协议波形并分析
  17. 适配USB接口奕力 ILITEK Multi-Touch-V5000
  18. ArcEngine IPageLayout 添加经纬网和公里网
  19. AD原理图库元件标识等字符上方的横线
  20. 首页仪表盘echart_封装万能表单组件

热门文章

  1. python结果导入excel_荐Python读取、写入EXCEL,处理数据完成运算具体实例及代码,Pycharm中导入库的操作流程...
  2. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF
  3. pyinstaller--将py文件转化成exe
  4. 《底层逻辑》--思维导图
  5. pla3d打印材料密度_3D打印金属材料模型过程中常见问题
  6. 学校计算机教室的用途,录播教室有什么功能,又有哪些用途
  7. c++mfc编写实验_零基础学Windows窗口图形界面编程(不用MFC),菜鸟学完变身高手,敢与专业媲美...
  8. 一个基于STM32实现的多组分气体分析仪项目
  9. Modbus协议栈开发笔记之六:Modbus RTU Master开发
  10. 使用EmBitz开发STM32项目开发环境配置