字符串正则匹配leetcode_动态规划100题

字符串正则匹配leetcode_动态规划100题原题链接给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入:s = “aa” p = “a”输出:false解释:”a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa” p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

原题链接
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。

‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1:

输入:s = "aa" p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:

输入:s = "aa" p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:

输入:s = "ab" p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:

输入:s = "aab" p = "c*a*b"
输出:true
解释:因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:

输入:s = "mississippi" p = "mis*is*p*."
输出:false

提示:

0 <= s.length <= 20
0 <= p.length <= 30
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符

题解

  1. 动态规划
    在这里插入图片描述
class Solution { 
   
    static const int N = 1e3 + 10;
public:
    bool isMatch(string s, string p) { 
   
        int n = s.size(),m = p.size();
        vector<vector<bool> >dp(n + 1,vector<bool> (m + 1));
        dp[0][0] = true;
        for(int i = 1;i <= m;i ++){ 
   
            if(p[i - 1] == '*' && ((i - 1) & 1))
            dp[0][i] = dp[0][i - 2];
        }
        for(int i = 1;i <= n;i ++){ 
   
            for(int j = 1;j <= m;j ++){ 
   
                if(p[j - 1] == '.' || p[j - 1] == s[i - 1])dp[i][j] = dp[i - 1][j - 1];
                else if(p[j - 1] == '*'){ 
   
                    dp[i][j] = dp[i][j - 2];
                    if(s[i - 1] == p[j - 2] || p[j - 2] == '.')dp[i][j] = dp[i][j] | dp[i - 1][j];
                }
            }
        }
        return dp[n][m];
    }
};
  1. dfs深搜
class Solution { 
   
public:
    bool isMatch(string s, string p) { 
   
        if(s.size() == 0 && p.size() == 0)return true;
        else if(s.size() != 0 && p.size() == 0)return false;
        else if(s.size() == 0 && p.size() != 0){ 
   
            //s为空的时候 p有可能出现a*.*b* 等带有*号的情况
            if(p.size() >= 2 && p[1] == '*' && isMatch(s,p.substr(2)))
                return true;
        }
        else{ 
   
            char a = s[0],b = p[0];
            //当有*的时候可以选择匹配一个或者多个
            if(p.size() >= 2 && p[1] == '*'){ 
   
                if(a == b || b == '.')return isMatch(s.substr(1),p) || isMatch(s,p.substr(2));
                else return isMatch(s,p.substr(2));
            }
            //但没*的时候只能一个一个匹配
            else if(a == b || b == '.')return isMatch(s.substr(1),p.substr(1));
        }
        return false;
    }
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168989.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 进程调度程序设计实验报告_进程调度模拟程序设计实验报告

    进程调度程序设计实验报告_进程调度模拟程序设计实验报告进程调度的设计与实现中文摘要无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。关键词进程调度C++优先级生命周期pidstatus前言实验目的1、综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布…

    2022年9月29日
    2
  • servlet-Filter过滤器

    servlet-Filter过滤器Filter过滤器Filter过滤器是javaweb的三大组件之一,三大组件分别是:Servlet程序,Listener监听器,Filter过滤器Filter过滤器它是javaEE的规范,也就是接口Filter过滤器它的作用是拦截请求,过滤响应拦截请求常见的应用场景:权限检查日记操作事务管理等等原理package at.guitu.com.FIlter;import javax.servlet.FilterChain;import javax.servlet.Filte

    2022年8月8日
    8
  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

    2022年4月25日
    109
  • 5分钟搞懂MySQL – 行转列

    5分钟搞懂MySQL – 行转列  MySQL行转列,对经常处理数据的同学们来说,一定是不陌生的,甚至是印象深刻,因为它大概率困扰到了你,让你为之一愣~但当你看到本文后,这个问题就不在是问题,及时收藏,以后谁再问你这个问题,直接甩他脸上,粘贴即用。

    2022年5月1日
    40
  • 详解正则表达式实现二代身份证号码验证[通俗易懂]

    详解正则表达式实现二代身份证号码验证[通俗易懂]二代身份证号码:1-6位:表示行政区划的代码。1、2位,所在省(直辖市,自治区)代码;3、4位,所在地级市(自治州)代码;5、6位,所在区(县,自治县,县级市)的代码;7-14位:表示出生年、月、日15-16位:所在地派出所代码17位:性别。奇数(1、3、5、7、9)男性,偶数(2、4、6、8、0)女性18位:校验位,存在十一个值:0,1,2,3,4,5,6,7,8,9,X,其值…

    2022年6月27日
    35
  • C语言中assert函数的用法[通俗易懂]

    断言(ASSERT)的用法  我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。  在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句:if(假设成立){程序正常运行;}e

    2022年4月12日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号