美文网首页动态规划
【剑指 offer】正则表达式匹配(DP)

【剑指 offer】正则表达式匹配(DP)

作者: 邓泽军_3679 | 来源:发表于2019-04-07 17:17 被阅读6次

1、题目描述

请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。

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

样例

输入:
s="aa"
p="a*"
输出:true

2、状态表示:O(nm)

  • f[i][j] 表示p从j开始到结尾,是否能匹配s从i开始到结尾。

3、状态转移:

1.如果p[j + 1]不是*,那么f[i][j]为真,有两种情况s[i] == p[j],且f[i + 1][j + 1]为真。
2.如果p[j + 1]是*,那么满足下列一种情况f[i][j]就为真。

  • f[i][j + 2]是真;(相当于*匹配0个)
  • s[i]可以和p[j]匹配,且f[i + 1][j]为真。(*匹配一个或者多个)

3.第一种情况很好理解,对于第二中情况的解释:

  • 如果*匹配0个,那么f[i][j] = f[i][j + 2].
  • 如果匹配1个的话,f[i][j] = f[i + 1][j].这里已经包含了s[i]==p[j],否则如果不等就包含了在 匹配0个里面,不用判断s[i]==p[j].
  • 如果匹配2个的话,f[i][j] = f[i + 1][j] = f[i +1 +1][j];
  • 如果。。。。可以知道都包含在f[i + 1][j]。中

4、C++代码:

class Solution {
public:
    vector<vector<int>> f;
    string s, p;
    int n, m;
    bool isMatch(string _s, string _p) {
        s = _s, p = _p;
        n = s.size(), m = p.size();
        f = vector<vector<int>>(n + 1, vector<int>(m + 1, -1));//状态记录。
        return dp(0, 0);
    }
    bool dp(int x, int y) {
        if (f[x][y] != -1)  return f[x][y];
        if (y == m) return f[x][y] = (x == n);//如果匹配到最后一个;
        if (p[y + 1] == '*') f[x][y] = dp(x, y + 2) || dp(x + 1, y);//p[y + 1]的情况。
        else if (p[y] == '.' && x < n) f[x][y] = dp(x + 1, y + 1);//不要忘记x < n, 我忘记了。
        else {//p[y + 1]既不是‘*’,也不是'.'的情况。
            if (s[x] == p[y]) f[x][y] = dp(x + 1, y + 1);
            else f[x][y] = false;
        }
        return f[x][y];
    }
};

相关文章

  • 【剑指 offer】正则表达式匹配(DP)

    1、题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它...

  • 正则表达式匹配

    《剑指offer》面试题19:正则表达式匹配 题目:请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字...

  • 字符串

    剑指offer所有的题目总结 牛客 正则表达式的匹配 leetcode的题目,解析描述更加全面 https://l...

  • 剑指offer第二版-19.正则表达式匹配

    本系列导航:剑指offer(第二版)java实现导航帖 面试题19:正则表达式匹配 题目要求:实现正则表达式中.和...

  • 剑指 Offer 60. n个骰子的点数

    剑指 Offer 60. n个骰子的点数 没写出来的简单dp

  • 表示数值的字符串

    《剑指offer》面试题20:正则表达式匹配 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例...

  • [剑指offer] 正则表达式匹配

    本文首发于我的个人博客:尾尾部落 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'....

  • 剑指offer | 正则表达式匹配

    正则表达式匹配 请实现一个函数来匹配包含"."和"*"的正则表达式。模式中的字符"."表示任意一个字符,而"*"表...

  • [剑指Offer]正则表达式匹配

    本文首发于我的个人博客Suixin’s Blog原文: https://suixinblog.cn/2019/02...

  • 剑指offer - 正则表达式匹配

    题目 请实现一个函数用来匹配包含.和*的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任...

网友评论

    本文标题:【剑指 offer】正则表达式匹配(DP)

    本文链接:https://www.haomeiwen.com/subject/aovsiqtx.html