类似题目:通配符匹配

动态规划解法:

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. leetcode297. 二叉树的序列化与反序列化

    代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...

  2. 免费FQ工具

    这里使用免费的`梯子` 下载赛风 选择Windows下载 下载好之后,直接点击打开,它会自动连接,什么也不要设置,下载的就是一个exe文件,连接成功会打开一个网页,不用管

  3. 用python编写一个合格的ftp程序,思路是怎样的?

      经验1.一般在比较正规的类中的构造函数.都会有一个verify_args函数,用于验证传入参数.尤其是对于系统传参.2.并且系统传参,其实后面大概都是一个函数名 例如:python server. ...

  4. 一跃进入C大门

    相对跳转:b,bl 绝对跳转:直接给PC指针赋值

  5. parfile解决exp时tables过多问题

    parfile 一般用于表数据过大.使用导出.导入命令参数过多等场景: 在对oracle数据库使用exp命令导出数据时,如果tables=后面跟的表比较多,就是导致命令行放不下,从而不能导出.百度一把 ...

  6. linux负载均衡杂谈

    假如架构中的主机拥有全量数据集,即使其中一台挂了,也不会导致离线,高可用(负载均衡集群) 假如架构中的各主机只拥有sharing,那我们谓之 分布式集群 硬件ctrix F5-BIG-IP(一台动辄2 ...

  7. vue前端与django后端数据交互

    //把数据传到路径为/airCdt/的django后端函数进行数据处理 onSubmit(){ const dict={ 'floor': this.formLabelAlign.floor, 'ro ...

  8. 【51nod1220】约数之和

    题目 d(k)表示k的所有约数的和.d(6) = 1 + 2 + 3 + 6 = 12. 定义S(N) = ∑1<=i<=N ∑1<=j<=N d(i*j). 例如:S(3) ...

  9. electron-vue 引入 vue.ant.design报错

    ERROR in ./node_modules/ant-design-vue/dist/antd.less (./node_modules/css-loader!./node_modules/less ...

  10. 通过喝水清晰简单了解I/O五大模型

    一般单次I/O请求会分为两个阶段,每个阶段对于I/O的处理方式是不同的 I/O会经历一个等待资源的阶段 阻塞,指的是在数据不可用时,I/O请求会一直阻塞,直到数据返回 数据不可用时,立即返回,直到被通 ...