首页 > 其他分享 >10. 正则表达式匹配

10. 正则表达式匹配

时间:2024-12-17 17:41:52浏览次数:10  
标签:10 匹配 正则表达式 process return false true dp

  1. 题目链接

  2. 解题思路:先写一个暴力递归,bool process(s, p, i, j)s[i...]p[j...]能否匹配成功?,i之前,以及j之前的都已经匹配成功了。

    • 1️⃣p[j + 1] != '*'

      • p[j] == '.',则递归调用process(s, p, i + 1, j + 1)

      • p[j] != s[i],返回false,否则返回process(s, p, i + 1, j + 1)

    • 2️⃣p[j + 1] == '*'

      • p[j] == '.',匹配0个.,即process(s, p, i, j + 2),匹配多个.,即process(s, p, i + 1, j),这两个递归,任意一个返回true,则是true
      • p[j] == s[i],匹配0个s[j],即process(s, p, i, j + 2),匹配多个s[j],即process(s, p, i + 1, j),两个递归,任意一个返回true,则是true,和上面可以合并成一个。
      • p[j] != s[i],只能匹配0个p[j],即process(s, p, i, j + 2)
  3. 有了暴力递归,可以发现,可变参数就是ij,所以可以加dp缓存表。

  4. 代码

    class Solution {
    public:
    
        // 现在匹配s[i...]以及p[j...],之前的已经匹配ok了,dp是缓存表,0表示false,1表示true,-1表示没有计算
        bool process(string &s, string &p, int i, int j, vector<vector<int>> &dp) {
            if (i == s.length() && j == p.length()) {    // 递归终止条件
                return true;
            }
            if (i == s.length()) {    // 递归终止条件
                if (j + 1 ==p.length()) {
                    return false;
                }
                if (p[j + 1] == '*') {
                    return process(s, p, i, j + 2, dp);
                }
                return false;
            }
            if (j == p.length()) {
                return false;
            }
            if (dp[i][j] != -1) {
                return dp[i][j];
            }
            if (j + 1 < p.length()) {
                if (p[j + 1] != '*') {
                    if (p[j] == '.') {
                        dp[i][j] = process(s, p, i + 1, j + 1, dp);
                        return dp[i][j];
                    } 
                    // p[j] != s[i]
                    if (p[j] != s[i]) {
                        dp[i][j] = false;
                        return false;
                    }
                    // p[j] == s[i]
                    dp[i][j] = process(s, p, i + 1, j + 1, dp);
                    return dp[i][j];
                }
                // p[j + 1] == '*'
                if (p[j] == '.' || p[j] == s[i]) {
                    bool next = process(s, p, i, j + 2, dp);    // 匹配0个
                    if (next) {    // 如果匹配成功了  就不用往下走了
                        dp[i][j] = true;
                        return true;
                    }
                    // 匹配多个
                    next = process(s, p, i + 1, j, dp);
                    dp[i][j] = next;
                    return next;
                }
                // p[j] != s[i]
                dp[i][j] = process(s, p, i, j + 2, dp);
                return dp[i][j];
            }
            // j是最后一个字符了
            if (p[j] == '.' || s[i] == p[j]) {
                dp[i][j] = process(s, p, i + 1, j + 1, dp);
                return dp[i][j];
            }
            // s[i] != p[j]
            dp[i][j] = false;
            return false;
    
        }
    
    
        bool isMatch(string s, string p) {
            int n1 = s.length();
            int n2 = p.length();
            vector<vector<int>> dp(n1 + 1, vector<int>(n2 + 1, -1));
            return process(s, p, 0, 0, dp);
        }
    };
    

标签:10,匹配,正则表达式,process,return,false,true,dp
From: https://www.cnblogs.com/ouyangxx/p/18613086

相关文章

  • 常见操作系统中安装Elasticsearch 2.10的步骤
    一、前提条件Java环境:Elasticsearch是基于Java开发的,所以需要先安装JavaDevelopmentKit(JDK)。推荐安装JDK8,确保java-version命令在终端中可以正确执行,并且版本符合要求。二、在Linux系统(以Ubuntu为例)中安装Elasticsearch2.10下载Elasticsearch访问Elasticsearch官方网......
  • T8333FI凯钰车规级LED驱动芯片升降压升压降压AEC-Q100
    T8333FI是一款由TMTechnology,Inc.设计的高效LED驱动控制器,广泛应用于高功率LED驱动领域,如汽车照明、LCD背光和室内外照明等。该芯片集成了多种保护功能和调节能力,能够在复杂应用中提供高精度、稳定的恒流输出。本文将对T8333FI的核心功能、技术参数及其应用领域进行详细分析......
  • MBI5353Q聚积车规级48通道点阵屏/RGB/直显屏AEC-Q100
    MBI5353Q是一款专为车规级动态LED图形应用设计的48通道PWM恒流LED驱动芯片,支持高达1:32的时间复用扫描应用,内置48K位SRAM,可通过片上PWM控制实现多种灰度深度选择(16/15/14/13位)。此产品旨在提升LED显示屏的刷新率和图像质量,特别适合车用动态显示、广告屏及工业控制应用。技术参......
  • 【华为OD-E卷-寻找链表的中间结点 100分(python、java、c++、js、c)】
    【华为OD-E卷-寻找链表的中间结点100分(python、java、c++、js、c)】题目给定一个单链表L,请编写程序输出L中间结点保存的数据。如果有两个中间结点,则输出第二个中间结点保存的数据。例如:给定L为1→7→5,则输出应该为7;给定L为1→2→3→4,则输出应该为3;输入描述......
  • 【华为OD-E卷-字符串重新排序 字符串重新排列 100分(python、java、c++、js、c)】
    【华为OD-E卷-字符串重新排序字符串重新排列100分(python、java、c++、js、c)】题目给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出:1、单词内部调整:对每个单词字母重新按字典序排序2、单词间顺序调整:1)统计每个单词出现的次数,并按次数降序排列2)次......
  • MUR8100AC-ASEMI快恢复二极管MUR8100AC
    编辑:llMUR8100AC-ASEMI快恢复二极管MUR8100AC型号:MUR8100AC品牌:ASEMI封装:TO-220AC特性:快恢复二极管正向电流:8A反向耐压:1000V恢复时间:35ns引脚数量:2芯片个数:2芯片尺寸:MIL浪涌电流:125A漏电流:10ua工作温度:-55℃~150℃包装方式:500/盘;5000/箱备受欢迎的MUR8100AC-ASEMI......
  • 1103 欧拉函数
    //1103欧拉函数.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/489输入T,一共T组数据,每组一个数n,输出它的欧拉函数φ(n)。输入格式第一行一个数字T。接下来T行,每行一个数字n。输出格式一共T行,每行一......
  • 基于yolov10的舌象检测识别系统,支持图像、视频和摄像实时检测【pytorch框架、python源
     更多目标检测,目标追踪、图像分类识别等项目可看我主页其他文章功能演示:yolov10,舌象检测识别系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili(一)简介基于yolov10的舌象检测识别系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据......
  • msvcp100.dll文件缺失的修复方法分享,全面分析msvcp100.dll的修复方法
    msvcp100.dll是一个动态链接库(DLL)文件,属于MicrosoftVisualC++2010RedistributablePackage的一部分。这个文件对于运行使用MicrosoftVisualC++2010编译器编译的应用程序至关重要。msvcp100.dll包含了C++标准库的实现,提供了应用程序运行时所需的核心功能,如输入/......
  • 【翻译_by_gpt】通过一个奇怪的技巧让你的 QEMU 快 10 倍(软件开发中的一个典型的debug
    标题:通过一个奇怪的技巧让你的QEMU快10倍URL来源:https://linus.schreibt.jetzt/posts/qemu-9p-performance.htmlMarkdown内容:这篇关于QEMU的工作和文章由DeterminateSystems资助,并在DeterminateSystems博客上共同发布。背景NixOS广泛使用基于QEMU的虚拟机......