leetcode10 正则表达式匹配 dp
刚好最近在学编译原理
有点想按照语法分析写。。不过用不着
因为知道正则表达式对一个串可能有多种匹配方法,所以要准备好回溯。
有最优子结构,一段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初始化
跑某个例子
dp[i][j] = match && dp[i+1][j+1];
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的更多相关文章
- [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching
Given an input string (s) and a pattern (p), implement regular expression matching with support for ...
- LeetCode10. 正则表达式匹配
10. 正则表达式匹配 描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该 ...
- LeetCode10.正则表达式匹配 JavaScript
给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不 ...
- [LeetCode] Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- Leetcode 10. 正则表达式匹配 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- [LeetCode] 10. 正则表达式匹配
题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支 ...
- LeetCode(10):正则表达式匹配
Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整 ...
- 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)
source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...
- 正则表达式匹配 C++实现 java实现 leetcode系列(十一)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 ...
随机推荐
- 【一天一个知识点系列】- Redis Cluser之数据分布
数据分布 简述 分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集 分区及限制 分区规则 常见的分区规则 顺序分区 哈希分区 ...
- CentOS 7 下安装 mysql ,以及用到的命令
VMware虚拟机装好后,再装个CentOS7系统,以上环境自行百度... 一.Linux下查看mysql是否安装 1.指令ps -ef|grep mysql [root@localhost 桌面]# ...
- DockerFile关键字相关作用以及解释
Dockerfile 关键字 作用 备注 FROM 指定父镜像 指定dockerfile基于那个image构建 MAINTAINER 作者信息 用来标明这个dockerfile谁写的 LABEL 标签 ...
- ROS教程(二):创建工作空间(图文)
ros教程:创建工作空间 目录 前言 一.工作空间? 二.创建一个工作空间 1.创建目录 2.编译 前言 使用catkin创建一个工作空间 一.工作空间? 在ROS系统下,我们所有的项目都放在一个工作 ...
- JVM(七)字符串详解
常量池: 我们前面也一直说常量池有三种: 1:class文件中的常量池,前面我们解析class文件的时候解析的就是,这是静态常量池.在硬盘上. 2:运行时常量池.可以通过HSDB查看,是Instan ...
- 免安装的tomcat转服务
一:确保tomcat 在点击bin\startup 文件可以正常启动访问: 二:本机安装有JDK: 三:本机环境变量配置:JAVA_HOME:C:\Java\jdk1.7.0_17; 四:本机Tomc ...
- Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践
Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...
- WPF设计模式下选定数据源?F12直达ViewModel的方法,超好用
您只需要在xaml上新增这一行代码,记得引用对应命名空间哦 d:DataContext="{d:DesignInstance viewModel:LoginViewModel, IsDesi ...
- NodeJS入门学习教程
一.概念 1.什么是nodejs Node.js是JavaScript 运行时环境,通俗易懂的讲,Node.js是JavaScript的运行平台 Node.js既不是语言,也不是框架,它是一个平台 2 ...
- power network 电网——POJ1459
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 27282 Accepted: 14179 D ...