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. HNUSTOJ-1051 最长的波动序列

    1051: 最长的波动序列 时间限制: 1 Sec  内存限制: 128 MB提交: 47  解决: 13[提交][状态][讨论版] 题目描述 有一个长度为N的整数序列,序列里面的数是两两不同的,现在 ...

  2. C#修改电脑桌面图

    win32helper public class Win32Helper { [DllImport("user32.dll", EntryPoint = "SystemP ...

  3. ThinkPHP5 支付宝支付扩展库(超级简单,超级好用!)

    ThinkPHP5 支付宝支付扩展库, 一个静态方法的调用就可以实现,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单所有功能,而且是2017年7月20日最新版~我的想法是,调用一个静 ...

  4. Android数据库使用指南(下)

    前言 上面已经说了,对表进行修改,其实就是对数据库进行升级,删除表也算升级啊,反正就是发生变化,数据库就需要升级. 所以老实说其实有个地方决定了数据库的版本 public class DBHelper ...

  5. react:如何创建一个新项目

    如何用react创建一个新的项目 我们打开react官网:https://reactjs.org/docs/create-a-new-react-app.html 看到以下命令 npx create- ...

  6. C语言对传入参数的处理

    /* Loop through argv parsing options. */    while ((c = getopt(argc, argv, ":f:a:l:h")) != ...

  7. java:投个票程序

    投票城市用到了:system.in, 正则pattern,matcher,排序接口comparable 复写compareTo排序方法 一个班级在选班长,按序号进行投票,并将票数最高的放在第一位显示 ...

  8. 多对多关系表的创建方式、forms组件

    目录 多对多关系表的三种创建方式 1.全自动,Django自动创建 2.纯手撸 3.半自动(推荐使用) forms组件 小例子 forms组件 校验器 钩子函数 局部钩子 全局钩子 forms组件常用 ...

  9. vue 父子组件渲染

    问题描述:父组件调用了一个子组件,传递了一个id的属性到子组件, 但是在子组件中将这个id的props属性赋值给了data里面定义的另外一个属性myId,并且写了watch监听这个id的props. ...

  10. Vue在移动端App中使用的问题总结

    1.客户端中弹出键盘使得fixed布局错乱 Vue 在移动端中使用,当弹出键盘时,fixed 布局的元素可能会被键盘顶起. 例子图示及解决方法参考:https://blog.csdn.net/qq_3 ...