刚好最近在学编译原理

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

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

有最优子结构,一段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. wmic process进程管理

    process    进程管理工具 示例:1.列举当前的进程.进程路径.命令行.进程ID.父进程ID.线程数,内存使用::wmic process get name,executablepath,co ...

  2. 如何创建一个验证请求的API框架

    ​开发一款成功软件的关键是良好的架构设计.优秀的设计不仅允许开发人员轻松地编写新功能,而且还能丝滑的适应各种变化. 好的设计应该关注应用程序的核心,即领域. 不幸的是,这很容易将领域与不属于这一层的职 ...

  3. PHP 框架之一Laravel

    Laravel: Laravel The phpFramework for Web Artisans and one of the best php framework in year 2014. L ...

  4. Understanding go.sum and go.mod file in Go

    https://golangbyexample.com/go-mod-sum-module/ Understanding go.sum and go.mod file in Go (Golang) – ...

  5. Java 类的加载与初始化

    本文结构: 1.先看几道题 2.类的加载于初始化 (1)类的加载 (2)类的初始化 (a)会发生类的初始化的情况 (b)不会发生类的初始化的情况 首先看几道题. 解析可在看完讲解后再看 Demo1 p ...

  6. 一本通提高篇——斜率优化DP

    斜率优化DP:DP的一种优化形式,主要用于优化如下形式的DP f[i]=f[j]+x[i]*x[j]+... 学习可以参考下面的博客: https://www.cnblogs.com/Xing-Lin ...

  7. 最简单直接地理解Java软件设计原则之开闭原则

    写在前面 本文属于Java软件设计原则系列文章的其中一篇,后续会继续分享其他的原则.想以最简单的方式,最直观的demo去彻底理解设计原则.文章属于个人整理.也欢迎大家提出不同的想法. 首先是一些理论性 ...

  8. PowerBI数据建模时的交叉连接问题

    方案一.在PowerPivot中,将其中一张表复制多份,分别与另一张表做链接. 方案二.在PowerQuery中,做多次合并查询,把所有数据集中在一张表中,方便后面的数据分析. 思考:不仅仅是在Pow ...

  9. Docker运行Mysql,Redis,SpringBoot项目

    Docker运行Mysql,Redis,SpringBoot项目 1.docker运行mysql 1.1拉取镜像 1.2启动容器 1.3进入容器 1.4开启mysql 1.5设置远程连接 1.6查看版 ...

  10. 使用Spring MVC实现文件上传与下载

    前段时间做毕业设计的时候,想要完成一个上传文件的功能,后来,虽然在自己本地搭建了一个ftp服务器,然后使用公司的工具完成了一个文档管理系统:但是还是没有找到自己想要的文件上传与下载的方式. 今天看到一 ...