10.正则表达式匹配


全文参考labuladong

10.正则表达式匹配

1. 状态和选择

dp[i][j] 表示 s 的前 i 个是否能被 p 的前 j 个匹配

2. base case

dp[0][0]=true # s与j是" "空字符,当然可以匹配

3. 状态转移方程

怎么想转移方程?首先想的时候从已经求出了 dp[i-1][j-1]入手,再加上已知 s的第i个字母s[i-1]、p的第j个字母p[j-1],要想的问题就是怎么去求 dp[i][j]

分情况讨论:

  1. 考虑最简单的 p[j-1] == s[i-1] : dp[i][j] = dp[i-1][j-1]
  2. 从 p[j] 可能的情况来考虑,让 p[j]=各种能等于的东西
    2.1. p[j-1] == "." : dp[i][j] = dp[i-1][j-1]
  • 2.2 p[j-1] ==*:这是本题的难点
    分两种讨论情况:

首先给了 *,明白 * 的含义是 匹配零个或多个前面的那一个元素,所以要考虑他前面的元素即p的第j个元素前面一个元素j-1 为p[j-2]。*跟着他前一个字符走,前一个能匹配上 s的第i个元素s[i-1],*才能有用,前一个都不能匹配上 s[i],*也无能为力,只能让前一个字符消失,也就是匹配 0次前一个字符。

  1. 就2.2进行扩展:
    1、p[j-2] != s[i-1] : dp[i][j] = dp[i][j-2]
    这就是刚才说的那种前一个字符匹配不上的情况,*无能为力,只能让前一个字符即p[j-2]出现0次,比如ab与abc*(因为p[]会有. *符号,所以i和j并不相等)
    2、p[j-1] == s[i] or p[j-1] == "." : dp[i][j]=dp[i][j-1]
  • *前面那个字符,能匹配 s[i-1],或者 * 前面那个字符是万能的 .
  • 比如 (##b , ###b *),或者 ( ##b , ### . *) 只看 ### 后面一定是能够匹配上的,在这个例子中,##b中的b为s[i-1], ###b*, ###.*中的b/.为p[j-2]即第j-1个元素。
  • 所以要看 b 和 b *前面那部分 ##的地方匹不匹配

还是看这位大佬的题解
事实证明,没有不会做的题,只有题解清不清晰的题。
在初始化这块,我卡了好久,对于空正则串p,非空字符串s的情况dp[i][0]=0, 这个i是s.size(), 我弄错成p的导致一直没有ac

class Solution{public:bool isMatch(string s, string p){//int m=s.size(),n=p.size();//if(0==m || 0==n) return false;//s = " " + s;//p = " " + p;int m=s.size(),n=p.size();vector<vector<bool>> dp(m+1, vector<bool>(n+1, false));//int dp[m+1][n+1];// base casedp[0][0]=true; // " "与" "匹配// 空正则初始化// dp[i][0]全为0, 非空串s与空正则串p肯定不匹配for(int i = 1; i <= m; i++){dp[i][0]=false;}// 空串/非空串s与非空正则p进行状态转移for(int i=0;i<=m;i++){for(int j=1;j<=n;j++){//非空正则分为两种情况 * 和 非*if(p[j-1]!='*'){if(i>0 && (s[i-1]==p[j-1] || p[j-1]=='.')){dp[i][j]=dp[i-1][j-1];}// else的情况已经默认为false了}else{// 碰到dp[j-1]=*号了, 分为看和不看两种情况// 不看if(j>=2){dp[i][j]= dp[i][j] || dp[i][j-2];}// 看if(i>=1 && j>=2 && (s[i-1]==p[j-2] || p[j-2]=='.')){dp[i][j] = dp[i][j] || dp[i-1][j];}}}}return dp[m][n];}
};

44.通配符匹配


主要思路:
官方题解

1.状态与选择

dp[i,j]: s的第i个字符s[i-1]与p的第j个字符p[j-1]的匹配情况

2.base case

// 非空串与空正则串的情况
// 空串与非正则串的情况(也可根据放到实际的状态转移来求(for循环),本题因为*能匹配空字符串,所以可以提前初始化)

3.状态转移

class Solution {public:bool isMatch(string s, string p) {// dp[i,j]: s的第i个字符s[i-1]与p的第j个字符p[j-1]的匹配情况int m=s.size(),n=p.size();vector<vector<bool>> dp(m+1, vector<bool>(n+1, false));// base casedp[0][0] = true;// 非空串与空正则串的情况// dp[i=1:m][0]=false; // 这个已经是默认初始化过了// 空串与非正则串的情况for(int j=1; j<=n; j++){ // 注意n列if(p[j-1]=='*'){dp[0][j] = true;}else{// 在dp[j-1]!='*'时,匹配失败break;}}// dp[i][0]与dp[0][j]初始化完毕// 都从i=1,j=1开始遍历for(int i=1; i<=m; i++){for(int j=1; j<=n; j++){if(s[i-1]==p[j-1]||p[j-1]=='?'){dp[i][j]=dp[i-1][j-1];}else if(p[j-1]=='*'){// 如果我们不使用这个星号,那么就会从 dp[i][j-1]dp[i][j−1] 转移而来// 如果我们使用这个星号,那么就会从 dp[i-1][j]dp[i−1][j] 转移而来dp[i][j] = dp[i][j-1] || dp[i-1][j];}}}return dp[m][n];}
};

正则表达式匹配/通配符匹配相关推荐

  1. 困难动态规划系列、经典的正则表达式和通配符匹配问题(难题)

    2020/10/24. 周六.今天又是奋斗的一天. 正则表达式(Regular Expression, RE)就是一组定义某种搜索模式(pattern)的字符. 文章目录 Leetcode 10 正则 ...

  2. LeetCode 43字符串相乘44通配符匹配

    原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...

  3. 《Python Cookbook 3rd》笔记(2.3):用Shell通配符匹配字符串

    用 Shell 通配符匹配字符串 问题 你想使用 Unix Shell 中常用的通配符 (比如 *.py , Dat[0-9]*.csv 等) 去匹配文本字符串 解法 fnmatch 模块提供了两个函 ...

  4. LeetCode 44. 通配符匹配(DP)

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

  5. python中正则表达式的默认匹配方式为_Python模式匹配与正则表达式

    1.1 不用正则表达式来匹配文本 假设我希望在一个字符串中找到电话号码,电话号码的格式为三个数字,一个短横线,四个数字,一个短横线,四个数字 比如:131-3310-5293和132-2670-986 ...

  6. c++正则表达式 日期格式匹配

    std::regex reg("(\\d{4})-(0\\d{1}|1[0-2])-(0\\d{1}|[12]\\d{1}|3[01])\\s(0\\d{1}|1\\d{1}|2[0-3]) ...

  7. Linux中使用正则表达式进行文本匹配

    文本: 哈利波特第一部,<哈利波特与魔法石>,Harry.txt grep --color -E "le" Harry.txt --color : 匹配到的字符用颜色标 ...

  8. 大白话聊框架设计(入门篇) | 第三章:通配符匹配Mapping实现

    文章目录 **1.通配符匹配Mapping实现** **2.重构ActionMapper** **3.修改WebConfig配置** **4.新增Mapping构造方法** **5.新增PersonA ...

  9. 刻意练习:LeetCode实战 -- Task30.通配符匹配

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

最新文章

  1. 《CSS揭秘》第五章:字体排印
  2. 池州市计算机专科,2021年3月安徽省池州市计算机等级考试时间
  3. v$sysstat表解释
  4. 机器学习——01、机器学习的数学基础1 - 数学分析
  5. 大数据WEB阶段(十三)JSP(一)JSP基础、JSP指令详解、四大域九大隐式对象总结
  6. IT职业就业-学长有话说(二)
  7. 建议检察院服务器服务器配置 显示器,切换器 键鼠
  8. buildroot 文件系统添加telnet, ssh, 以及制作注意事项
  9. Visio使用技巧备忘录
  10. ACOPTools:一步步帮你快速、高效构建多基因联合系统发育树
  11. 高薪岗位云计算面试题,云计算运维工程师必备
  12. CAN通讯程序C语言,AT90CAN单片机CAN通信模块介绍及软件编程
  13. 肠道菌群失衡的症状、原因和自然改善
  14. Python八个自动化办公的技巧
  15. 【pandas】 DataFrame缺失值的查找与填充
  16. 09组团队项目-Alpha冲刺-1/6
  17. 基于实例分割方法的端到端车道线检测 论文+代码解读
  18. java 窗体添加背景图片_Java Swing实现窗体添加背景图片的2种方法详解
  19. 西瓜书 6.1 计算 样本空间任意点x到超平面(w,b)的距离d
  20. 【案例】蜂巢链:基于区块链的资产证劵化

热门文章

  1. 计算机网络技术店面取名,适合电脑店的名字大全 霸气的电脑店铺起名
  2. unity 灯光烘焙对比
  3. 踩坑记录:管理实验室新购服务器
  4. [PRIMITIVE TECHNOLOGY]澳洲小哥的黑皮豆/black been/摩顿湾板栗(栗子)/Moreton Bay Chestnut...
  5. 用 supabase实时数据库 实现 协作
  6. 单点登录(sso)和cas系统的原理
  7. 宏观经济学_宏观经济指标
  8. 关于工资结算的C语言程序,C语言程序设计,纳税工资系统
  9. 零知识证明的硬件加速
  10. 黑马程序员——黑马学习日志之二十 Java高新技术(二)