类似题目:通配符匹配

动态规划解法:

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. 全局捕获异常(适用于SpringMvc,SpringBoot项目)

    @ControllerAdvice 是controller的一个辅助类,最常用的就是作为全局异常处理的切面类.约定了几种可行的返回值,可以返回String字符串,也可以返回ModelAndView,也 ...

  2. autocomplete用法

    今天又使用到 jquery-ui.min.js中的autocomplete这个方法了,记得第一次是在实习的时候已经是一年前了,现在只记得个模样了,所以去找了原来的代码,整理的半天才有理顺,这里分享一下 ...

  3. oracle exp 和 imp 数据和表结构互相独立导出导入

    1)只导入数据.不到导入表结构 不可能只导出数据而不导出表结构 这里做了一个变向处理可以在imp时使用ignore=Y选项就可以了,而不报错. 这样就可以实现把数据导入到原来的表里: imp user ...

  4. google的CacheBuilder缓存

    适用性: 计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存. 常用用法: LoadingCache<Key, Graph> graphs = Cac ...

  5. 模态框 modal.js

    模态框经过了优化,更加灵活,以弹出对话框的形式出现,具有最小和最实用的功能集. 不支持模态框重叠 千万不要在一个模态框上重叠另一个模态框.要想同时支持多个模态框,需要自己写额外的代码来实现. 模态框的 ...

  6. 安装nodejs与使用

    nodejs 官方下载地址:https://nodejs.org/en/ 下载完成后,双击打开安装程序 然后: 然后点击install,等待安装 安装完成后的目录如下: 检测是否真的安装成功.打开cm ...

  7. vscode预览markdown文件

    前提是需要安装Markdown Preview Enhanced插件

  8. JAVA笔记12-接口interface

    1.概念:接口是抽象方法和常量值得定义的集合.本质上,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现. 接口定义举例: 2.接口特性: (1)接口可以多重实现:(接口 ...

  9. C# 遍历控件名称

    List<string> list = new List<string>(); list.Add("textBox2"); list.Add("t ...

  10. CSS定位——文档流定位

    关于CSS的定位机制Ⅰ ㈠概念 对于盒子模型来说,也就是页面元素,这些盒子究竟在页面的什么位置,怎样排列它,那么找到它的位置,确定它的位置,这个就是定位机制所决定的. ㈡分类 文档流, 浮动定位,层定 ...