leetcode 正则表达式匹配
类似题目:通配符匹配

动态规划解法:
1. p[j] == s[i]: dp[i][j] = dp[i-1][j-1]
2. p[j] == ".": dp[i][j] = dp[i-1][j-1]
3. p[j] =="*":
3.1 p[j-1] != s[i]: dp[i][j] = dp[i][j-2]
3.2 p[i-1] == s[i] or p[i-1] == ".":
dp[i][j] = dp[i-1][j] // 多个a的情况
or dp[i][j] = dp[i][j-1] // 单个a的情况
or dp[i][j] = dp[i][j-2] // 没有a的情况
C++代码:
class Solution {
public:
bool isMatch(string s, string p) {
int ls=s.size(),lp=p.size();
vector< vector<int> > dp(ls+,vector(lp+,));
dp[][]=;
int flag=;
for(int j=;j<lp;j++){
if(j>= && p[j-]!='*' && p[j]!='*') flag=;
if(p[j]=='*') dp[][j+]=flag;//else dp[0][j]=0 没必要写
}
for(int i=;i<ls;i++){
for(int j=;j<lp;j++){
if(s[i]==p[j] || p[j]=='.'){
dp[i+][j+]=dp[i][j];
}else if(p[j]=='*'){
if(p[j-]!=s[i] && p[j-]!='.'){
dp[i+][j+]=dp[i+][j-];
}else{
dp[i+][j+]=dp[i+][j-] || dp[i+][j] || dp[i][j+];
}
}
}
}
return dp[ls][lp];
}
};
之前看动态规划的解法,此处尝试直接利用逻辑关系匹配未果,还有几十样例没有通过,应该是*.情景的判断出现了问题,其实主要可以分为以下几个情况:
是s[i]==p[j] 完全匹配
a*.b这种有可能是0个a,然后.匹配任意字符,也有可能是数个a,但此时会忽略可能出现几个a的情况;
.*匹配任意字符串,还比较好处理
class Solution {
public:
bool isMatch(string s, string p) {
int ls=s.size(),lp=p.size();
int i=,j=,match=,start=-;
while(i<s.size()){
if(j<lp && (s[i]==p[j] || p[j]=='.') ){
i++;j++;
}else if(j<lp && p[j]=='*'){
start=j-;
match=i;
j++;
}else if(start!=- && (p[start]==s[i] || p[start]=='.') ){
match++;
i=match;
j=start+;
}else if(j+<p.size() && p[j+]=='*'){
j++;
}else
return false;
}
while(j<p.size()){
if(p[j]!='*') return false;
j++;
}
return true;
}
};
p[j] == s[i]:dp[i][j] = dp[i-1][j-1]
p[j] == ".":dp[i][j] = dp[i-1][j-1]
p[j] =="*":
3.1 p[j-1] != s[i]:dp[i][j] = dp[i][j-2]
3.2 p[i-1] == s[i] or p[i-1] == ".":
dp[i][j] = dp[i-1][j] // 多个a的情况
or dp[i][j] = dp[i][j-1] // 单个a的情况
or dp[i][j] = dp[i][j-2] // 没有a的情况
作者:powcai链接:https://leetcode-cn.com/problems/two-sum/solution/dong-tai-gui-hua-by-powcai/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
leetcode 正则表达式匹配的更多相关文章
- LeetCode正则表达式匹配
题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 ...
- [LeetCode] Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- Leetcode 10. 正则表达式匹配 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- LeetCode(10):正则表达式匹配
Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整 ...
- [LeetCode][Facebook面试题] 通配符匹配和正则表达式匹配,题 Wildcard Matching
开篇 通常的匹配分为两类,一种是正则表达式匹配,pattern包含一些关键字,比如'*'的用法是紧跟在pattern的某个字符后,表示这个字符可以出现任意多次(包括0次). 另一种是通配符匹配,我们在 ...
- leetcode 10 Regular Expression Matching(简单正则表达式匹配)
最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...
- Leetcode(10)正则表达式匹配
Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...
- [LeetCode] 10. Regular Expression Matching 正则表达式匹配
Given an input string (s) and a pattern (p), implement regular expression matching with support for ...
- Java实现 LeetCode 10 正则表达式匹配
10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配, ...
随机推荐
- Hyperledger Fabric(3)通道与组织
1,通道的结构 通道是Fabric中非常重要的概念(类似微信群?),它实质是由排序节点划分和管理的私有原子广播通道,目的是对通道的信息进行隔离,使得通道外的实体无法访问通道内的信息,从而实现交易的隐私 ...
- 什么是DDoS攻击?
本文转载自知道创宇云安全的知乎回答:DDoS 的肉鸡都是哪来的? 说到DDoS攻击,我们就不得不说“肉鸡”. “肉鸡”可谓是DDoS攻击的核心大杀器,作为一个要发起DDoS攻击的黑客来说,没有肉鸡就是 ...
- 使用ELK进行日志分析
0x01 前言: 前段时间做应急,总是需要溯源分析,痛点是数据量比较大,想要短时间能分析出来.再者就是之前在调查某酒店事件的时候特别羡慕某产商有各种分析溯源工具.反思过后,终于在没有那么忙的时候开始搭 ...
- java多线程ExecutorService
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...
- linux命令详解——lsof
lsof全名list opened files,也就是列举系统中已经被打开的文件.我们都知道,linux环境中,任何事物都是文件, 设备是文件,目录是文件,甚至sockets也是文件.所以,用好lso ...
- 简单了解TCP/IP与HTTP
这种东西网上资源非常丰富,完全没有必要造轮子,更何况 这也不是你能造的啊,来 上连接 TCP/IP https://www.runoob.com/tcpip/tcpip-intro.html HTTP ...
- nginx-轮询、权重、ip_hash 、fair模式
在 linux 下有 Nginx.LVS.Haproxy 等等服务可以提供负载均衡服 务,而且 Nginx 提供了几种分配方式(策略): 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器 ...
- 多线程-生产者消费者(BlockingQueue实现)
三.采用BlockingQueue实现 BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需 ...
- grunt-css-sprite css 代码中的切片合并
安装插件:npm install grunt-css-sprite --save-dev grunt-css-sprite主要功能:1.对 css 文件进行处理,收集切片序列,生成雪碧图2.在原css ...
- js 设置多条css样式
如果在一个网页中给id="mydiv"的元素添加css样式,先获取该节点:var obj = document.getElementById("mydiv"); ...