正则表达式匹配

https://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c?tpId=13&tqId=11205&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:分两种情况,即模式串的第二个字符是不是‘*’

(1)当第二个字符不是‘*’的时候,直接看当前字符和模式串是否相等或者模式串的当前字符是否为 ‘.’

如果是就匹配下一个,否则直接返回false

(2)当第二个字符是' * '的时候,如果模式串的当前字符和字符串的当前字符是匹配的,分为三种情况继续匹配

1) * 前面的字符出现0次,则匹配模式串的后两位,即有match(str, pattern + 2)

2) * 前面的字符出现1次,则字符串后移1位, 模式串后移两位、

3)*前面的字符串出现2次或者两次以上,则模式串不动,字符串后移1位。

举个例子,字符串abc  模式串是a*bc

* 号前的a匹配成功了,如果 * 前面的a 出现0次,那么patern + 2,即模式串跳到b 去和字符串的a 匹配

如果 * 前面的a 出现1次,那么pattern + 2,str+1,即字符串跳到下一位即b,模式串跳到下两位即b去继续匹配

如果 * 前面的a 出现2次或者2次以上,即题目说的任意次,多次,那么str + 1,pattern 保持不变(因为*前面还剩下很多个a)。即字符串的b和模式串的a继续匹配。

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

	bool checkmore(char * str, char * pattern )
	{
		if(*str == '\0' && *pattern == '\0')
			return true;
		if(*str != '\0' && *pattern == '\0')
			return false;

		if(*(pattern + 1) == '*')//第二个字符是'*'
		{
			if(*pattern == *str || ( *pattern == '.' && *str != '\0'))//*前面的字符匹配成功
			{
				return checkmore(str, pattern + 2) || //*前面的字符出现0次
					checkmore(str + 1, pattern + 2) ||//*前面的字符出现1次
					checkmore(str + 1, pattern);//*前面的字符出现多次
			}
			else
				return checkmore(str, pattern + 2);//*前面的字符匹配失败,模式串串左移2位
		}

		//第二个字符不是*且当前字符匹配成功的时候
		if(*pattern == *str || (*pattern == '.' && *str != '\0'))
			return checkmore(str +1, pattern + 1);
		//第二个字符不是*且当前字符匹配失败的时候
		return false;
	
	}
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值