[AcWing30]正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式。
模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
class Solution{
public:
bool isMatch(string s, string p){
}
};
题目并没有给出数据范围
一篇良心题解
设令 \(s\) 长度为 \(n\) , \(p\) 长度为 \(m\) , \(f[i][j]\) 表示 \(p[j,m]\) 能否匹配 \(s[i,n]\)
\(1.\) 如果 \(p[j+1]\) \(!=\) '\(*\)' , 则 \(f[i][j]\) 为真当且仅当 \(s[i]\) 可以和 \(p[j]\) 匹配 , 且 \(f[i+1][j+1]\) 为真 .
\(2.\) 如果 \(p[j+1]\) \(==\) '\(*\)' , 则 \(f[i][j]\) 有以下两种情况可以为真 :
"\(*\)" 代表 \(0\) 个 \(p[j]\) , 等价于 \(f[i][j+2]\) 为真 ;
"\(*\)" 代表若干个 \(p[j]\) , 等价于 $f[i+1][j] $ 为真而且 \(s[i]\) 可以和 \(p[j]\) 匹配
然后就可以用记忆化了 , 一共 \(nm\) 个状态 , 时间复杂度 \(O(nm)\) .
class Solution{
public:
vector<vector<int>> f;
int n, m;
bool isMatch(string s, string p){
n = s.size(), m = p.size();
f = vector<vector<int>>(n + 1, vector<int>(m + 1, -1));
// f = n+1个 ((m+1个-1)组成的vector)
return dp(0, 0, s, p);
}
inline bool dp(int x, int y, string& s, string& p){
if(x > n || y > m) return 0;
if(f[x][y] != -1) return f[x][y];
if(y == m)
return f[x][y] = (x ==n);
bool now_match = ((s[x] == p[y]) || (p[y] =='.'));
bool ans;
if(p[y + 1] == '*')
ans = dp(x, y + 2, s, p) || (now_match && dp(x + 1, y, s, p));
else
ans = now_match && dp(x + 1, y + 1, s, p);
return f[x][y] = ans;
}
};
一道锻炼思维的好题 , \(DP\) 思维最能体现一个人的水平 .
[AcWing30]正则表达式匹配的更多相关文章
- [LeetCode] Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码
正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码: String regex_name="ssid=\"(.*?)\&quo ...
- 在Visual Studio中使用正则表达式匹配换行和批量替换
系统环境:Windows 8.1 Enterprise Update 2 x64 开发环境:Mircosoft Visual Studio Ultimate 2013 Update 2 RC 问题:如 ...
- .NET正则表达式匹配Silverlight
这是一个.NET正则表达式匹配工具的Silverlight 在页面中加入以下代码就可以了: <"> <param name="source" value ...
- Flex的正则表达式匹配速度与手工代码的比较
flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...
- Java/Js下使用正则表达式匹配嵌套Html标签
转自:http://www.jb51.net/article/24422.htm 以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题(使用正则表达式匹配嵌套Html标签),但是里 ...
- Java正则表达式匹配例子
Java正则表达式匹配例子 package com.ibm.test; import java.util.regex.Matcher; import java.util.regex.Pattern; ...
- *****正则表达式匹配URL
最近将匹配URL的正则替换了下 之前的是: ((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3 ...
- bash 正则表达式匹配,一行文本中 “包含 ABC” 并且 “不包含 XYZ”
bash 正则表达式匹配,一行文本中 “包含 ABC” 并且 “不包含 XYZ” A文件: XXXX ABC XXX4444444444444444XXXX ABC XXX XYZ6666666 ...
随机推荐
- jquery里把数组转换成json的方法
首先来看,jquery里自带的,和json相关的函数: 1.$.parseJSON : 用来解析JSON字符串,返回一个对象. 什么叫“JSON字符串”? 比如: var a={name:&quo ...
- 【转】别人写的pe代码
// PEOperate.cpp: implementation of the PEOperate class. // //////////////////////////////////////// ...
- 快速弄清JavaScript中undefined和null的区别
ES6的7大数据类型里面有这俩玩意:undefined和null,让接触不深的学习者常常产生混淆,这俩玩意的区别在哪呢? 字面意思上来看,undefined是未(被我们)阐明的,未说明的,null则意 ...
- php实现浏览器大文件分片上传
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...
- vue-cli3构建多页面应用
创建一个项目hello-world vue create hello-worldcd hello-worldnpm run serve 在src目录下新建pages目录,在pages下新建页面 App ...
- Python回归分析五部曲(三)—一元非线性回归
(一)基础铺垫 一元非线性回归分析(Univariate Nonlinear Regression) 在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条曲线近似表示,则称为一元非线性回归 ...
- Python图形用户界面-Tkinter
Tkinter是什么 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多一个直观的功能,如何想开发一个计算器,如果 ...
- MIME协议(三) -- MIME邮件的组织结构
一封MIME邮件可以由多个不同类型的MIME消息组合而成,一个MIME消息表示邮件中的一个基本MIME资源或若干基本MIME消息的组合体.每个MIME消息的数据格式与RFC822数据格式相似,也包括头 ...
- 【redis 学习系列】API的理解与使用(三)
4.列表 列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a.b.c.d.e五个元素从左到右组成一个有序列表,列表中的每个字符串称为元素,一个列表最大可以存储2^32-1个元素.在R ...
- HearthBuddy遇奥秘解决方法
https://tieba.baidu.com/g/5808796816 链接: https://pan.baidu.com/s/1NPQTOfxbN_4alP7J-XWuVw 密码: xfj1