# LeetCode刷题记录——10正则表达式匹配

LeetCode刷题记录——10正则表达式匹配

一 题目描述

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

 ‘.' 匹配任意单个字符

‘*'匹配零个或多个前面的那一个元素
  • 示例:

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

二 思路:

.比较好解决,但是*就不好解决了,因为*前面既可以是普通字符,也可以是. ,情况比较复杂,因此考虑能不能使用动态规划,将一个复杂的问题转换为一个一个小的问题,从而缩减问题的规模。从局部开始,使用递归的方式进行处理

  • 当前的匹配字符串p为空时,如果此时s为空,则返回true,反之返回false
  • 当前的匹配字符串p不为空时,那么需要分情况考虑,考虑下一位是否含有*,并且假设当前字符位置匹配情况为currentmatch:
    • 如果下一位有*:
      • 当前字符串出现0次,那么无论current匹配与否,都return isMatch(s,p.substr(2));
      • 当前字符串至少出现一次,那么至少当前应该匹配成功,并且递归求解,return current && isMatch(s.substr(1),p.substr(2));
    • 下一位不具有*:
      • 如果当前匹配成功,则继续递归求解
      • 若匹配失败,直接返回false
bool isMatch(const char* s,const char* p){
        //c字符串是以\0结尾的
        if(*p==0) return *s==0;

        bool currentmatch=(*s!=0) && (*s==*p||*p=='.');

        if(*(p+1)=='*'){
            return isMatch(s,p+2)|| currentmatch&&isMatch(s+1,p);
        }else{
            return currentmatch&&isMatch(s+1,p+1);
        }
}

bool IsMatch(string s, string p) {
    //string对象的.c_str()返回一个c字符串的指针,即const char *
    return isMatch(s.c_str(),p.c_str());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值