• LeetCode-剑指19-正则表达式匹配


    在这里插入图片描述

    1、递归

    我们可以通过选取当前字符串的子串来递归的匹配当前的表达式:1、若表达式为空而字符串不为空返回false;2、若表达式的第二位为“*”,则存在两种可能,一种是第一位匹配,我们继续匹配第二位;第二种是第一位不匹配,此时我们从表达式的第三位开始进行匹配;3、若表达式的第二位不为“*”,我们继续匹配字符串和表达式的第二位。

    class Solution {
    public:
        bool isMatch(string s, string p){
            if (p.empty())  return s.empty();
            bool first_match = !s.empty() && (s[0] == p[0] || p[0] == '.');
            if (p.size() >= 2 && p[1] == '*')
                return (first_match && isMatch(s.substr(1), p)) || isMatch(s, p.substr(2));
            else
                return first_match && isMatch(s.substr(1), p.substr(1));
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、动态规划法

    我们可以利用数组 f [ i ] [ j ] f[i][j] f[i][j]来记录字符串的前i位与表达式的前j位的匹配情况。我们可以获得状态转化方程如下: f [ i ] [ j ] = { 若 p [ j ] ≠ ′ ∗ ′ , { f [ i − 1 ] [ j − 1 ] ,s[i]与p[j]相匹配 f a l s e ,s[i]与p[j]不匹配 若 p [ j ] = ′ ∗ ′ , { f [ i − 1 ] [ j ] o r f [ i ] [ j − 1 ] ,s[i]与p[j-1]相匹配 f [ i ] [ j − 2 ] ,s[i]与p[j]不匹配

    f[i][j]={p[j]{f[i1][j1],s[i]与p[j]相匹配false,s[i]与p[j]不匹配p[j]={f[i1][j]orf[i][j1],s[i]与p[j-1]相匹配f[i][j2],s[i]与p[j]不匹配" role="presentation" style="position: relative;">f[i][j]={p[j]{f[i1][j1],s[i]与p[j]相匹配false,s[i]与p[j]不匹配p[j]={f[i1][j]orf[i][j1],s[i]与p[j-1]相匹配f[i][j2],s[i]与p[j]不匹配
    f[i][j]= p[j]={f[i1][j1]s[i]p[j]相匹配falses[i]p[j]不匹配p[j]={f[i1][j]orf[i][j1]s[i]p[j-1]相匹配f[i][j2]s[i]p[j]不匹配

    class Solution {
    public:
        bool isMatch(string s, string p) {
            int m = s.size();
            int n = p.size();
    
            auto matches = [&](int i, int j) {
                if (i == 0) {
                    return false;
                }
                if (p[j - 1] == '.') {
                    return true;
                }
                return s[i - 1] == p[j - 1];
            };
    
            vector<vector<int>> f(m + 1, vector<int>(n + 1));
            f[0][0] = true;
            for (int i = 0; i <= m; ++i) {
                for (int j = 1; j <= n; ++j) {
                    if (p[j - 1] == '*') {
                        f[i][j] |= f[i][j - 2];
                        if (matches(i, j - 1)) {
                            f[i][j] |= f[i - 1][j];
                        }
                    }
                    else {
                        if (matches(i, j)) {
                            f[i][j] |= f[i - 1][j - 1];
                        }
                    }
                }
            }
            return f[m][n];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    【 css动画 】—— 把你喜欢css动画嵌入到浏览器中
    P13 JDBC 简介
    正确安装gdal库:ModuleNotFoundError: No module named ‘osgeo‘
    【LeetCode】308d:给定条件下构造矩阵
    设计师常用的8款作图软件推荐
    【Java 进阶篇】深入了解 JavaScript 的 innerHTML 属性
    软件工程 测试二
    Jenkins 中 shell 脚本执行失败却不自行退出
    考研数学|《1800》+《660》精华搭配混合用(经验分享)
    i7 1255u和i5 1135G7哪个好
  • 原文地址:https://blog.csdn.net/weixin_43825194/article/details/127658007