[AcWing30]正则表达式匹配

请实现一个函数用来匹配包括'.''*'的正则表达式。

模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。

例如,字符串"aaa"与模式"a.a""ab*ac*a"匹配,但是与"aa.a""ab*a"均不匹配。

class Solution{
public:
bool isMatch(string s, string p){ }
};

题目并没有给出数据范围

一篇良心题解

设令 \(s\) 长度为 \(n\) , \(p\) 长度为 \(m\) , \(f[i][j]\) 表示 \(p[j,m]\) 能否匹配 \(s[i,n]\)

\(1.\) 如果 \(p[j+1]\) \(!=\) '\(*\)' , 则 \(f[i][j]\) 为真当且仅当 \(s[i]\) 可以和 \(p[j]\) 匹配 , 且 \(f[i+1][j+1]\) 为真 .

\(2.\) 如果 \(p[j+1]\) \(==\) '\(*\)' , 则 \(f[i][j]\) 有以下两种情况可以为真 :

"\(*\)" 代表 \(0\) 个 \(p[j]\) , 等价于 \(f[i][j+2]\) 为真 ;

"\(*\)" 代表若干个 \(p[j]\) , 等价于 $f[i+1][j] $ 为真而且 \(s[i]\) 可以和 \(p[j]\) 匹配

然后就可以用记忆化了 , 一共 \(nm\) 个状态 , 时间复杂度 \(O(nm)\) .

class Solution{
public:
vector<vector<int>> f;
int n, m;
bool isMatch(string s, string p){
n = s.size(), m = p.size();
f = vector<vector<int>>(n + 1, vector<int>(m + 1, -1));
// f = n+1个 ((m+1个-1)组成的vector)
return dp(0, 0, s, p);
}
inline bool dp(int x, int y, string& s, string& p){
if(x > n || y > m) return 0;
if(f[x][y] != -1) return f[x][y];
if(y == m)
return f[x][y] = (x ==n);
bool now_match = ((s[x] == p[y]) || (p[y] =='.'));
bool ans;
if(p[y + 1] == '*')
ans = dp(x, y + 2, s, p) || (now_match && dp(x + 1, y, s, p));
else
ans = now_match && dp(x + 1, y + 1, s, p);
return f[x][y] = ans;
}
};

一道锻炼思维的好题 , \(DP\) 思维最能体现一个人的水平 .

[AcWing30]正则表达式匹配的更多相关文章

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

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

  2. 正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码

    正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码: String regex_name="ssid=\"(.*?)\&quo ...

  3. 在Visual Studio中使用正则表达式匹配换行和批量替换

    系统环境:Windows 8.1 Enterprise Update 2 x64 开发环境:Mircosoft Visual Studio Ultimate 2013 Update 2 RC 问题:如 ...

  4. .NET正则表达式匹配Silverlight

    这是一个.NET正则表达式匹配工具的Silverlight 在页面中加入以下代码就可以了: <"> <param name="source" value ...

  5. Flex的正则表达式匹配速度与手工代码的比较

    flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...

  6. Java/Js下使用正则表达式匹配嵌套Html标签

    转自:http://www.jb51.net/article/24422.htm 以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题(使用正则表达式匹配嵌套Html标签),但是里 ...

  7. Java正则表达式匹配例子

    Java正则表达式匹配例子 package com.ibm.test; import java.util.regex.Matcher; import java.util.regex.Pattern; ...

  8. *****正则表达式匹配URL

    最近将匹配URL的正则替换了下 之前的是: ((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3 ...

  9. bash 正则表达式匹配,一行文本中 “包含 ABC” 并且 “不包含 XYZ”

    bash 正则表达式匹配,一行文本中  “包含 ABC”  并且  “不包含 XYZ” A文件: XXXX ABC XXX4444444444444444XXXX ABC XXX XYZ6666666 ...

随机推荐

  1. [转]vue-router各个属性的作用及用法

    转自以下网址,当备忘使用:https://www.cnblogs.com/goloving/p/9211358.html vue-router是vue单页面开发的路由,就是决定页面跳转的! <r ...

  2. 2 MVC设计模式

    0 基础知识 (1)B/S与C/S结构 C/S(客户机/服务器 client/service):分为客户机和服务器两层,应用软件安装在客户端通过网络与服务器通信 B/S(liulanq/服务器 bro ...

  3. Xilinx FFT IP核缩放因子说明

    以1024点FFT为例, reg [9:0] scale_sch = 10'b11_10_01_01_01; 流水线结构中,将每个基 2 的蝶形处理单元视为一个阶段. 每个阶段进行一次数据的缩减,缩减 ...

  4. OFDM留空中央直流子载波目的及原理

    目的: 降低峰均比! 原理: IDFT公式: 直流分量k接近0,公式近似于对X(k)进行累加,因此直流分量会产生较大的信号能量,造成严重的峰均比. 详细内容可参考: https://dwz.cn/Zl ...

  5. not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

    not(expr|ele|fn) 概述 从匹配元素的集合中删除与指定表达式匹配的元素   参数 exprStringV1.0 一个选择器字符串.深圳dd马达 elementDOMElementV1.0 ...

  6. Python PageFactory-使用配置文件动态生成页面PageObject

    需求 在Python Selenium 的 PageObject模式中,一般每个页面需要写一个类, 一种PageObject的写法如下: class BaiduPageObject(object): ...

  7. Django-CRM后台管理系统

    crm整体流程 表结构 from django.db import models # Create your models here. from django.contrib.auth.models ...

  8. git push and git pull

    原文链接 git push 通常对于一个本地的新建分支,例如git checkout -b develop, 在develop分支commit了代码之后,如果直接执行git push命令,develo ...

  9. Final阶段贡献分配规则

    此次作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/10063 贡献分分配规则: 组内一共五名同学,贡献分共计50分. 1.每 ...

  10. Java-LockSupport

    LockSupport 和 CAS 是 Java 并发包中很多并发工具控制机制的基础,它们底层其实都是依赖 Unsafe 实现. LockSupport 提供 park() 和 unpark() 方法 ...