剑指offer:正则表达式

题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。

例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

 

首先  因为下一位的出现的可能性有 字符  *  。  三种情况

因此考虑递归是最便捷的方法

 

确定递归出口: 

                    必须要str 和 pattern 同时走到尾部         为  true

                     其他情况   无论str先走完  还是pattern  先走完    都为false 

 

根据下一位是否为  *  可以分为以下两种情况:

如果不是    :       

                    *str==*pattern     或者     *pattern  == ‘.’     

                     这样的情况说明当前字符匹配 同时向后走一位

如果是   :    根据  * 匹配的位置仍要分情况考虑

                      1.  源字符串的第一位  与  模式传中 *  后一位匹配

                            abcdef   与   a * abcdef

                            此时递归的处理就是将   match_core(str,pattern+2);

                       2.源字符的第二位  与  模式串中   *  前一位匹配

                           aabc   与     a * abc             a

                           此时递归的处理就是将   match_core(str + 1,pattern);

                          3.源字符的第二位  与  模式串中   *  后一位匹配

                           abc   与     a * bc                 b

                           此时递归的处理就是将   match_core(str + 1,pattern + 2);


class Solution {
public:
	bool match(char* str, char* pattern)
	{
		if (str == nullptr || pattern == nullptr)
			return false;
		return match_core(str, pattern);
	}

	bool match_core(char* str, char* pattern)
	{
		//寻找递归出口
		//也就是说   str和pattern同时走到尾部
		if (*str == '\0'&&*pattern == '\0')
			return true;
		if (*str != '\0'&&*pattern == '\0')
			return false;
		if (*str == '\0'&&*pattern != '\0')
			return false;
		//pattern的下一位是*   
		//三种情况:    匹配0  匹配 1   匹配  2+
		//如果下一位不是*  直接接下去匹配

		if ((*str == *pattern) || *pattern == '.')
		{
			return match_core(str + 1, pattern + 1);
		}

		if (*(pattern + 1) == '*')
		{
			//‘。’可以代表任何字符
			if ((*str == *pattern) || *pattern == '.')
			{
				return match_core(str, pattern + 2) || match_core(str + 1, pattern) || match_core(str + 1, pattern + 2);
			}
			else
			{
				return match_core(str, pattern + 2);
			}
		}
		return false;
	}
};

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值