正则表达式匹配/通配符匹配
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]
分情况讨论:
- 考虑最简单的 p[j-1] == s[i-1] : dp[i][j] = dp[i-1][j-1]
- 从 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次前一个字符。
- 就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];}
};
正则表达式匹配/通配符匹配相关推荐
- 困难动态规划系列、经典的正则表达式和通配符匹配问题(难题)
2020/10/24. 周六.今天又是奋斗的一天. 正则表达式(Regular Expression, RE)就是一组定义某种搜索模式(pattern)的字符. 文章目录 Leetcode 10 正则 ...
- LeetCode 43字符串相乘44通配符匹配
原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...
- 《Python Cookbook 3rd》笔记(2.3):用Shell通配符匹配字符串
用 Shell 通配符匹配字符串 问题 你想使用 Unix Shell 中常用的通配符 (比如 *.py , Dat[0-9]*.csv 等) 去匹配文本字符串 解法 fnmatch 模块提供了两个函 ...
- LeetCode 44. 通配符匹配(DP)
1. 题目 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串 ...
- python中正则表达式的默认匹配方式为_Python模式匹配与正则表达式
1.1 不用正则表达式来匹配文本 假设我希望在一个字符串中找到电话号码,电话号码的格式为三个数字,一个短横线,四个数字,一个短横线,四个数字 比如:131-3310-5293和132-2670-986 ...
- 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]) ...
- Linux中使用正则表达式进行文本匹配
文本: 哈利波特第一部,<哈利波特与魔法石>,Harry.txt grep --color -E "le" Harry.txt --color : 匹配到的字符用颜色标 ...
- 大白话聊框架设计(入门篇) | 第三章:通配符匹配Mapping实现
文章目录 **1.通配符匹配Mapping实现** **2.重构ActionMapper** **3.修改WebConfig配置** **4.新增Mapping构造方法** **5.新增PersonA ...
- 刻意练习:LeetCode实战 -- Task30.通配符匹配
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
最新文章
- 《CSS揭秘》第五章:字体排印
- 池州市计算机专科,2021年3月安徽省池州市计算机等级考试时间
- v$sysstat表解释
- 机器学习——01、机器学习的数学基础1 - 数学分析
- 大数据WEB阶段(十三)JSP(一)JSP基础、JSP指令详解、四大域九大隐式对象总结
- IT职业就业-学长有话说(二)
- 建议检察院服务器服务器配置 显示器,切换器 键鼠
- buildroot 文件系统添加telnet, ssh, 以及制作注意事项
- Visio使用技巧备忘录
- ACOPTools:一步步帮你快速、高效构建多基因联合系统发育树
- 高薪岗位云计算面试题,云计算运维工程师必备
- CAN通讯程序C语言,AT90CAN单片机CAN通信模块介绍及软件编程
- 肠道菌群失衡的症状、原因和自然改善
- Python八个自动化办公的技巧
- 【pandas】 DataFrame缺失值的查找与填充
- 09组团队项目-Alpha冲刺-1/6
- 基于实例分割方法的端到端车道线检测 论文+代码解读
- java 窗体添加背景图片_Java Swing实现窗体添加背景图片的2种方法详解
- 西瓜书 6.1 计算 样本空间任意点x到超平面(w,b)的距离d
- 【案例】蜂巢链:基于区块链的资产证劵化
热门文章
- 计算机网络技术店面取名,适合电脑店的名字大全 霸气的电脑店铺起名
- unity 灯光烘焙对比
- 踩坑记录:管理实验室新购服务器
- [PRIMITIVE TECHNOLOGY]澳洲小哥的黑皮豆/black been/摩顿湾板栗(栗子)/Moreton Bay Chestnut...
- 用 supabase实时数据库 实现 协作
- 单点登录(sso)和cas系统的原理
- 宏观经济学_宏观经济指标
- 关于工资结算的C语言程序,C语言程序设计,纳税工资系统
- 零知识证明的硬件加速
- 黑马程序员——黑马学习日志之二十 Java高新技术(二)