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

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

说明:

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

思路:
因为有*号可以匹配多个字符,使用动态规划来保存所有匹配情况。
dp[i][j]表示s的前i个字符和p的前j个字符匹配。
有了状态,接下来就是考虑状态转移方程。
1.如果是字符或是’.’,就很简单。

      dp[i][j] = dp[i-1][j-1]   (s[i]==p[j]  || p[j]=='.')

2.如果p[j]是’*’,由于 可以匹配多个字符。这里考虑:

(1)不匹配。 判断去掉*和前一个字符是否匹配dp[i][j] = dp[i][j-2])
(2) 先匹配s[i]字符,再检查i之前的字符是否匹配, 如果不匹配则dp[i][j]不匹配。()dp[i][j] = dp[i-1][j]   (s[i]==p[j] ||  p[j]=='.')
  bool isMatch(string s, string p) {//dp[i][j] 表示s的前i个字符和p的前j个字符匹配int n = s.size(), m = p.size();if(m == 0){   // 边界特判if(n == 0) return true;else return false;}if(p[0] == '*') return false;  // 星号前面没有其他字符是非法的状态vector<vector<bool>> dp(n + 1, vector<bool>(m + 1, false));dp[0][0] = true;s = "#" + s;            //加一个字符是为了索引都转为1开始p = "#" + p;for(int i = 2; i <= m; i ++){  // 处理0的情况。也就p和空字符串匹配的情况if(p[i] == '*') dp[0][i] = dp[0][i - 2];// else dp[0][i] = false;}for(int i = 1; i <= n; i ++){  // 开始进行状态转移for(int j = 1; j <= m; j ++){if(p[j] != '*'){// 不是星号,这样就只需判断s[i] 和 p[j] ,字符是否能匹配dp[i][j] = dp[i-1][j-1] && (s[i] == p[j] || p[j] == '.');  } else{ //*号,这里只有两种情况,一个就是匹配0个,还有匹配了s[i]。  //比如  aaab和aaab*      b*匹配一个b,  然后判断aaa 和 aaab*是否匹配    dp[i][j] = dp[i][j - 2] || dp[i-1][j] && (s[i] == p[j - 1] || p[j - 1] == '.');  }}}return dp[n][m];}

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

  1. LeetCode题库10:正则表达式匹配——JavaScript解答

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

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

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

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

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

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

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

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

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

  6. LeetCode题库解答

    此篇博客用于记录自己在 LeetCode 网站中所做过的习题,便于日后忘记了进行查阅.前期全部采用 Python3的语法来解答,后续时间充裕的话,希望自己可以试着用 JavaScript.C++/C ...

  7. LeetCode题库第2题 两数相加

    两数相加 LeetCode题库第二题 两数相加 看完题目,就可以将题目抽象为三个指针,前两个指针是l1和l2,后一个指针是我们要求的,这三个指针同时移动,由于可能会产生进位,所以可以用一个变量来存储这 ...

  8. LeetCode题库第1题 两数之和

    两数之和 LeetCode题库第1题 两数之和 看到题,我就想到了暴力法: public int[] force(int[] nums,int target) {for (int i = 0; i & ...

  9. LeetCode题库整理【Java】—— 2 两数相加

    LeetCode题库整理[Java] 2.两数相加 题目:给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果, ...

  10. LeetCode题库整理【Java】—— 7整数反转

    LeetCode题库整理[Java] 7.整数反转 题目:给出一个32位的有符号整数,你需要将这个这个整数中每位上的数字进行反转. 示例1: 输入: 123 输出: 321 示例2: 输入: -123 ...

最新文章

  1. 给Ubuntu 16.04更换更新源
  2. Nis服务器主从安装配置
  3. 【IOI2018】狼人【Kruscal重构树】【主席树】
  4. LeetCode 1760. 袋子里最少数目的球(二分查找)
  5. php 给图片加水印
  6. Atitit java项目常用类库表 目录 1. Ati总的常用库 1 1.1. 表达式,语言解析类库 1 1.2. 字符串模板解析库velocity freemark 1 1.3. rest库
  7. 微信公众账号开发入门准备
  8. The General Framework Of Signal ProcessingOTFS Modulation Scheme(信号处理的一般框架OTFS调制)(4)
  9. linux查看内存条pn,查看电脑内存条型号的两种方法【图文】
  10. linux模拟tcp测试工具,TCP测试小工具tcping for linux
  11. Dev C++项目开发是添加背景音乐 CC++
  12. yuv图片旋转180度,镜像水平翻转
  13. Windows 7 旗舰版 64位 (纯净版)
  14. 利用Yocto构建嵌入式Linux教程02--Yocto的一些基本概念介绍
  15. Camera ISO、快门、光圈、曝光这几个概念
  16. 语音识别之HTK入门(二)
  17. 教你快速高效接入SDK——Unity统一接入渠道SDK(Android篇)
  18. 在JSP中使用数据库
  19. 复古风的小鱼缸,还有幻彩灯效加持,忆趣TV3.0体验
  20. 好用又简单的引流技巧:你只需要一篇软文

热门文章

  1. python中reshape_python numpy reshape用法及代码示例
  2. Pyspider爬虫实例:1号店医药电商
  3. pytorch学习笔记(十四):实战Kaggle比赛——房价预测
  4. python——pandas库之DataFrame数据结构基础
  5. ~~欧几里得算法(附模板题)
  6. 用openbabel将pdbqt文件转成pdb
  7. 配置一台用于深度学习的个人工作站系统的实验记录[主机可以买现成的或自己配,裸机即可]
  8. tensorflow代码中的一个bug
  9. 机器学习-极大似然估计
  10. 【Qt串口调试助手】1.2 - 串口数据接收不发生换行,CH340 / CP2102 多硬件兼容