10. 正则表达式匹配

2023-07-08 10:53:52 浏览数 (1)

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;
    }

0 人点赞