正则表达式匹配

题目描述
请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配

昨天晚上提交不通过,今天提交就能通过,也是服了。
题目明显可以实用递归进行求解,注意一下几种情况,
1、pattern中出现连续两个‘*’或者开头就是”*”的直接返回false,因为这不是正确的正则表达式。
2、如果pattern到达末尾,那么str必须到达末尾,否则直接返回不匹配
3、如果pattern没有达到末尾,但是str到达末尾,则需要单独判断之后的pattern是否是连续出现两个非“*”如果是返回false,直到遍历到pattern末尾返回true
4、对于其他情况,如果对应的pattern第二个字符不是“*”,那么直接比对当前字符,不匹配直接返回false,匹配的话pattern和str都向前加1;
5、如果对应的pattern第二个字符是‘*’那么分为以下几种情况
如果当前字符是不匹配的:

  • 可以直接将pattern后移两个字符,对应的*是代表前面出现0次的情况

如果当前字符是匹配的:

  • str直接向后移动一个,对应的*是出现2次以上的情况
  • 可以直接将pattern后移两个字符,对应的*是代表前面出现0次的情况
  • str向后移动一个,pattern向后移动2个,代表*前面的字符只出现1次的情况
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(*pattern=='*')
            return false;
        char* patt=pattern;
        while(*patt!='\0')
            {
            if(*patt=='*'&&*(patt+1)=='*')
                return false;
            else 
                ++patt;
        }
        return recurmatch(str,pattern);

    }
   bool recurmatch(char* str, char* pattern)
       {
       if(*pattern=='\0'&&*str=='\0')
           return true;
       else if(*pattern=='\0'&&*str!='\0')
           return false;
       else if(*pattern!='\0'&&*str=='\0')
           return judgepatt(pattern);
       if(*(pattern+1)!='*')
            {
           if(*str==*pattern||*pattern=='.')
               return recurmatch(str+1, pattern+1);
           else
               return false;
       }

          if(*pattern==*str||*pattern=='.')
               return recurmatch(str+1, pattern)||recurmatch(str, pattern+2)||recurmatch(str+1, pattern+2);

          return recurmatch(str, pattern+2);


   }

    bool judgepatt(char *patt){
       while(*patt!='\0')
           {
           if((*patt!='*')&&(*(patt+1)!='*'))
               return false;
           ++patt;
       }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值