1. 题目

2. 解答

在 回溯算法 中我们介绍了一种递归的思路来求解这个问题。

此外,这个问题也可以用动态规划的思路来解决。我们定义状态 \(P[i][j]\) 为子串 \(s[0, i)\) 和 \(p[0, j)\) 是否匹配,能匹配为真,反之为假,然后状态转移方程则可以分为以下三种情况:

    1. 如果 p[j-1] != ‘*’ && (s[i-1] == p[j-1] || p[j-1] == ‘.’) ,说明当前两个字符可以匹配且没有遇到 \('*'\),那么此时 P[i][j] = P[i-1][j-1],也即若 \(s[0, i-1)\) 和 \(p[0, j-1)\) 匹配,则 \(s[0, i)\) 和 \(p[0, j)\) 也能匹配;
    1. 如果 p[j-1] == ‘*’ ,说明当前字符为 \('*'\),并且我们用其匹配零个字符,那么 P[i][j] = P[i][j-2],也即若 \(s[0, i)\) 和 \(p[0, j-2)\) 匹配,则跳过 \(p[j-2],p[j-1]\) 两个元素后 \(s[0, i)\) 和 \(p[0, j)\) 也能匹配;
    1. 如果 p[j-1] == ‘*’ ,说明当前字符为 \('*'\),并且我们用其匹配至少一个字符,而且还需满足 s[i-1] == p[j-2] || p[j-2] == ‘.’,那么 P[i][j] = P[i-1][j],也即若 \(s[0, i-1)\) 和 \(p[0, j)\) 匹配,那么我们用这个 \('*'\) 来匹配 \(s[i-1]\) 后, \(s[0, i)\) 和 \(p[0, j)\) 也就能匹配。 至少一次是说这里 \('*'\) 已经被用了一次,而前面 \(s[0, i-1)\) 和 \(p[0, j)\) 的匹配也有可能会用到。

其中 2 和 3 只需满足一个即可匹配,代码如下。

class Solution {
public: bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
vector<bool> temp(n+1, false);
vector<vector<bool> > dp(m+1, temp);
dp[0][0] = true; for (int j = 1; j <= n; j++)
if (p[j - 1] == '*')
dp[0][j] = dp[0][j-2]; for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (p[j - 1] == '*')
{
bool repeat_zero = false;
bool repear_one_more = false;
repeat_zero = dp[i][j - 2];
if (s[i - 1] == p[j - 2] || p[j - 2] == '.')
repear_one_more = dp[i - 1][j];
dp[i][j] = repeat_zero || repear_one_more;
} else
{
if (s[i - 1] == p[j - 1] || p[j - 1] == '.')
dp[i][j] = dp[i-1][j-1];
}
}
}
return dp[m][n];
}
};

获取更多精彩,请关注「seniusen」!

LeetCode 10——正则表达式匹配的更多相关文章

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

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

  2. Java实现 LeetCode 10 正则表达式匹配

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

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

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

  4. LeetCode 10. 正则表达式匹配(Regular Expression Matching)

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

  5. leetcode题目10.正则表达式匹配(困难)

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

  6. 【LeetCode】正则表达式匹配(动态规划)

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

  7. LeetCode10. 正则表达式匹配

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

  8. leetcode 10 Regular Expression Matching(简单正则表达式匹配)

    最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,pyt ...

  9. Leetcode(10)正则表达式匹配

    Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...

随机推荐

  1. Diango路由映射FBV和CBV

    django中请求处理方式有2种:FBV(function base views) 和 CBV(class base views),换言之就是一种用函数处理请求,一种用类处理请求. FBV # url ...

  2. PyTorch环境配置及安装

    环境配置 温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9Yj ...

  3. java体系中OOP,OOD,OOA分别代表什么含义,以及OA,CRM,ERP

    OOP:Object Oriented Programming 面向对象程序设计. OOD:Object Oriented Design 面向对象设计. OOA:Object Oriented Ana ...

  4. CentOS7.6下设置mysql服务开机启动

    在centos7中所有对服务的管理都集中到了systemctl当中,所以服务的启动.关闭.重启.开机启动等等的操作都可以用systemctl. systemctl对服务的管理都是通过配置文件,配置文件 ...

  5. Spring基础13——Spring表达式语言:SpEL

    1.SpEL简介 Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言.语法上类似于EL:SpEL使用#{...}作为界定符,所有在大框号中的字符都将被认为是Sp ...

  6. mongo配置

    cmd下操作 cd /d E:\MongoDB\bin 创建数据库: mongod --dbpath E:\MongoDB\data\db 验证是否成功,登陆localhost:27017 进入E:\ ...

  7. 内置time模块和random模块

    #time模块#time模块中有三种时间表达方式#时间戳(timestamp):指从1970年1月1号0:0:0开始按秒计算的时间偏移量#元组形式的结构化时间(strut_time):含有9个元素(t ...

  8. Codeforces1214D. Treasure Island (dp + Hash)

    题目链接:传送门 思路: 仔细观察可以发现,答案最多就是2,只要把(2,1)和(1,2)堵住就可以了. 答案是0的情况就是初始状态下,(1,1)就已经不可达(n,m)了,很好判断. 所以重点就是区分答 ...

  9. C#基础知识之SharpZipLib压缩解压的使用

    项目中使用 Velocity 将模板和生成的动态内容(HTML.XML等)合并保存到redis数据库中,考虑到压缩的文件容量会比较小,方便传输而且存储所使用的空间也会比较小,所以要压缩一下,读取的时候 ...

  10. 表达式,数据类型和变量(Expressions,Data Types & Variables)

    (一)表达式: 1)4+4就是表达式,它是程序中最基本的编程指令:表达式包含一个值(4)和操作符号(+),然后就会计算出一个单独的值; 2)一个单独的值没有包含操作符号也可以叫表达式,尽管它只计算它本 ...