前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10. 正则表达式匹配

10. 正则表达式匹配

作者头像
用户3519280
发布2023-07-08 10:53:52
1330
发布2023-07-08 10:53:52
举报
文章被收录于专栏:c++ 学习分享c++ 学习分享

10. 正则表达式匹配

难度困难2981

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

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1:

代码语言:javascript
复制
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

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

示例 3:

代码语言:javascript
复制
输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。

提示:

  • 1 <= s.length <= 20
  • 1 <= p.length <= 30
  • s 只包含从 a-z 的小写字母。
  • p 只包含从 a-z 的小写字母,以及字符 . 和 *
  • 保证每次出现字符 * 时,前面都匹配到有效的字符
代码语言:javascript
复制
bool isMatchEmpty(string s, string p) {
        if(p.empty()&&s.empty())return true;
        if(p.back()!='*')return false;
        if(p.size()>=2&&p.back()=='*'){
            return isMatchEmpty(s,p.substr(0,p.size()-2));
        }
        return false;
    }
    bool isMatch(string s, string p) {
         if(p.empty()&&s.empty())return true;
          if(p.empty()&&!s.empty())return false;
          //s='' p="a*" ".*"或者其他不符合情况
          if(s.empty()){
              return isMatchEmpty(s,p);
          }
          int psize=p.size()-1;
          int ssize=s.size()-1;
          //s="x"  p="."        ||p="x"
          //s.back()这个开始错了
          //if(p.back()!='*'&&(p.back()==s.back() ||s.back()=='.')){
          if(p.back()!='*'&&(p.back()==s.back() ||p.back()=='.')){
              return isMatch(s.substr(0,ssize),p.substr(0,psize));
          }
          bool ret=false;
          if(ret==false&&p.back()=='*'&&p.size()>=2){
              //a=abcxx p=abcx*  ||abc.*
              //结尾是*或者结尾相同
              if(p[psize-1]==s[ssize]||p[psize-1]=='.')
              
              //这个地方又抄错了
              //return isMatch(s.substr(0,ssize),p);
              {
                  ret= isMatch(s.substr(0,ssize),p);
                  //cout<<s.substr(0,ssize)<<ssize<<ret<<endl;
              }
              
                //ret=false && 这个地方丢了一个=
              if(ret==false && ( p[psize-1]==s[ssize] || p[psize-1]=='.' )){
                  ret=isMatch(s,p.substr(0,psize-1));
                  cout<<p.substr(0,psize-1)<<psize<<ret<<endl;
              }
              
          }
          if(false==ret&&p.back()=='*'&&p.size()>=3&&s.size()>=1){
                  //s = "abcx" p ="abcxz*"  p = "abc.z*"
            if (p[psize - 1] != s[ssize] && (p[psize - 2] == s[ssize] || p[psize - 2] == '.' )) {
                ret = isMatch(s.substr(0, ssize ), p.substr(0,psize-2));
            }
            //s = "abcx" p ="abcxz*"  p = "abc.z*"
            if (ret ==false && p[psize - 1] != s[ssize]) {
                ret = isMatch(s, p.substr(0, psize - 1));
            }
              }
        return ret;
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档