刚好最近在学编译原理

有点想按照语法分析写。。不过用不着

因为知道正则表达式对一个串可能有多种匹配方法,所以要准备好回溯。

有最优子结构,一段s由一段p生成,于是dp。

常规思路是从前开始逐个字符匹配

这里想一下,倒着匹配考虑的情况少一些(其实是想正写发现太难了。。。囧)

dp[i][j]表示s[i:]可以由p[j:]生成(匹配。)于是就只需要考虑0-i-1,0-j-1的匹配

match是某个生成式的字符(x或.,而不是*)与某个串某个字符匹配

如s=abbb,p=ab*

bbb与b*匹配,每一个b都与b*的b匹match。

若匹配只有两种情况,单个.匹配和x*匹配。

具体处理

单个.匹配 dp[i][j] = first_match && dp[i+1][j+1]; //可能匹配到(match==true),则推进一位

x*匹配 dp[i][j] = dp[i][j+2] ||match && dp[i+1][j];    //两种情况,可能使用p[j],匹配不到,dp[i][j] = dp[i][j+2] ; 或可以匹配,则dp[i][j] =dp[i+1][j],一个个字符推进(i+1)

复杂度分析看官方题解吧

 注意初始化

没加false初始化

跑某个例子

"mississippi"
"mis*is*p*."
报错
 dp[i][j] = match && dp[i+1][j+1];
load of value 48, which is not a valid value for type 'bool'
 
class Solution {
public:
bool isMatch(string s, string p) { bool dp[s.length() + 1][p.length() + 1];
for(int i=0;i<=s.length();i++)
for(int j=0;j<=p.length();j++)
dp[i][j]=false;
dp[s.length()][p.length()] = true; for (int i = s.length(); i >= 0; i--){
for (int j = p.length() - 1; j >= 0; j--){
bool match = (i < s.length() &&(p[j] == s[i] ||p[j] == '.'));
if (j + 1 < p.length() && p[j+1] == '*'){ //x*匹配
dp[i][j] = dp[i][j+2] || match && dp[i+1][j];
} else { //单个.匹配
dp[i][j] = match && dp[i+1][j+1];
}
}
}
return dp[0][0];
}
};

leetcode10 正则表达式匹配 dp的更多相关文章

  1. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

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

  2. LeetCode10. 正则表达式匹配

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

  3. LeetCode10.正则表达式匹配 JavaScript

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

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

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

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

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

  6. [LeetCode] 10. 正则表达式匹配

    题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支 ...

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

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

  8. 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)

    source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...

  9. 正则表达式匹配 C++实现 java实现 leetcode系列(十一)

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

随机推荐

  1. 记一次使用logmnr查找操作人流程

    经常遇到开发的需求,帮我查一下是谁修改了表里面的记录,是谁对表进行了DDL操作,此类问题可以使用logmnr解决 1.根据操作时间定位归档日志 SELECT name FROM V$ARCHIVED_ ...

  2. 天天用SpringBoot居然还不知道它的自动装配的原理?

    引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...

  3. 用xmind设计用例:

    注意一个原则:清晰明了,简单高效 注意不要写成需求分析,从测试的角度对场景进行分类管理 注意点: 1.思维导图重要的是逻辑清晰归类,注意有不要太多具体的操作步骤 举个例子(来源:https://www ...

  4. Servlet中的一些注意事项

    servlet中的一些注意事项 1 什么是servlet? 1)Servlet是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案.而具体的Servle ...

  5. libevent之基于socket的bufferevent

    基于socket的bufferevent由一个socket的传输层和read/write buffer组成.区别于常规的event,当socket可读或者可写时会回调用户的callback,buffe ...

  6. 这几个小技巧,让你书写不一样的Vue!

    前言 最近一直在阅读Vue的源码,发现了几个实战中用得上的小技巧,下面跟大家分享一下. 同时也可以阅读我之前写的Vue文章 vue开发中的"骚操作" 挖掘隐藏在源码中的Vue技巧! ...

  7. Okio Okio源码分析

    概述 Okio 作为 Okhttp 底层 io 库,它补充了 java.io 和 java.nio 的不足,使访问.存储和处理数据更加容易.Okio 的特点如下: okio 是一个由 square 公 ...

  8. LOJ2130软件包

    题目描述Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软 ...

  9. 通达OA<=11.5版本SQL注入——日程安排

    注入点产生位置

  10. 删除无用docker镜像

    docker images | grep none | grep -v grep | awk '{print $3}' | xargs docker rmi -f