类似题目:通配符匹配

动态规划解法:

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 正则表达式匹配的更多相关文章

  1. LeetCode正则表达式匹配

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

  2. [LeetCode] Regular Expression Matching 正则表达式匹配

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  3. Leetcode 10. 正则表达式匹配 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  4. LeetCode(10):正则表达式匹配

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

  5. [LeetCode][Facebook面试题] 通配符匹配和正则表达式匹配,题 Wildcard Matching

    开篇 通常的匹配分为两类,一种是正则表达式匹配,pattern包含一些关键字,比如'*'的用法是紧跟在pattern的某个字符后,表示这个字符可以出现任意多次(包括0次). 另一种是通配符匹配,我们在 ...

  6. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

  7. Leetcode(10)正则表达式匹配

    Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...

  8. [LeetCode] 10. Regular Expression Matching 正则表达式匹配

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

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

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

随机推荐

  1. 自己实现一个简化版Mybatis框架

    MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码.本文完成的Mybatis功能比较简单,代码还有许多需要改进的地方,大家可以结合M ...

  2. JRebel最新破解激活版(IDEA自动部署插件)

    参考: https://www.52pojie.cn/thread-906163-1-1.html https://blog.csdn.net/xingbaozhen1210/article/deta ...

  3. vi 必须要学会的技能

    vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...

  4. 【hdu 6089】Rikka with Terrorist

    题意 有一个 \(n\times m\) 的二维网格,其中有 \(k\) 个禁止点. 有 \(q\) 组询问,每组询问为给一个点,求有多少个矩形以这个点为一角且不包含禁止点. \(n,m,k,q\le ...

  5. Fiddler debug 拦截文件

    前言 前端每次本地调试的需要重新build文件,而且如果当前文件是在另外一个项目中使用,则还需要拷贝到另外一个项目下面.这个工作很耗时.如果使用替换包,可以节省很多时间,也便于开发. 解决方案 用Fi ...

  6. grunt-contrib-uglify js压缩

    grunt-contrib-uglify:压缩以及合并JavaScript文件. 插件安装:npm install grunt-contrib-uglify --save-dev 参数: banner ...

  7. 无法将 DBNull.Value 强制转换为类型“System.DateTime”。请使用可空类型

    取数据库中的数据时,数据库中的字段有可能是空值,虽然Linq中的Field方法和SetField方法都可以处理可以为 null 的类型,不必像前面的示例那样检查 Null 值,我们再用Field将一些 ...

  8. __stdcall、__cdcel、__fastcall 调用

    常用的调用约定有stdcall,cdecl,fastcall,thiscall,naked call等,以下将 __stdcall.__cdecl和__fastcall三种函数调用协议加以比较,函数调 ...

  9. 基于nc命令监控服务端口的Shell脚本

    Shell代码: #!/bin/bash export LANG=en_US.UTF- #IP Address=127.0.0.1 #Port Port= #尝试的次数 n= #nc timeout, ...

  10. head first 设计模式笔记3-装饰者模式:星巴兹饮料

    开放原则:类应该对扩展开放,对修改关闭. - 上篇博客中的观察者模式中,通过加入新的观察者,我们可以在任何时候扩展主题(Subject),而且不需向主题中添加代码. - 装饰者模式也完全遵循开放原则. ...