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. PHP 中一个 False 引发的问题,差点让公司损失一百万

    PHP 中一个 False 引发的问题,差点让公司损失一百万 一.场景描述 上周我一个在金融公司的同学,他在线上写一个 Bug,差点造成公司损失百万.幸好他及时发现了这个问题并修复了.这是一个由 PH ...

  2. Jafka源码分析——网络架构

    在kafka中.每个broker都是一个server.依照一般理解,server就是一个SocketServer,其不断接收用户的请求并进行处理.在Java中进行网络连接有两种方式一种为堵塞模式一种为 ...

  3. [Nest] 01.初见nest.js

    github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...

  4. MAC设置环境变量

    1. Mac 启动加载文件位置(可设置环境变量) ------------------------------------------------------- (1)首先要知道你使用的Mac OS ...

  5. Solr知识点摘录

    1.Solr和Lucene区别: 2.Solr的下载与安装 3. 4. 5. 6.Solr基础 7. 8.Solr索引操作 9. 10.

  6. 从零开始学MySQL(四)

    上节连接:https://www.cnblogs.com/RajXie/p/10880809.html 上节说到,在创建表的同时,需要给出列的定义.列的定义可展开如下: 列名 列的数据类型 列的一些其 ...

  7. Python 序列化 pickle/cPickle模块

    Python 序列化 pickle/cPickle模块 2013-10-17 Posted by yeho Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给 ...

  8. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).

    Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 解决办法一:保 ...

  9. 【NOIP2016提高组A组7.16】大鱼海棠

    题目 椿是掌管海棠花的少女,她所在的世界不为人们所知,他们的天空就是人类的海底.生活在那个世界里的他们不是人,也不是鱼,而是其他人,掌管着人间的规律. 按照他们的习俗,在16岁那年,椿变为一条海豚到人 ...

  10. 前端使用crypto-js进行加解密

    import CryptoJS from 'crypto-js' export const crypto = { options() { return { key: CryptoJS.enc.Utf8 ...