剑指offer 题19—正则表达式匹配

正则表达式匹配

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

每次从字符串中拿出一个字符和模式中的字符去匹配。

假设字符串a表带匹配的字符串,字符串b是模式

如何匹配

1、如果模式b中的字符ch是 ’.’ 那么它可以匹配字符串的任意字符
2、如果模式b中的字符ch不是 ‘.’,而且字符串a中的字符也是ch,那么互相匹配,此时需要接着匹配后面的字符
3、当后面的字符不是 ‘ * ’ 时
如果字符串a中的第一个字符和模式b中第一个字符相匹配,那么两者都向后移,否则返回false
4、当后面的字符为 ’ * ’ 时
可能存在着多种匹配方式;
第一种,模式b向后移动两个字符而字符串a不动,表示匹配0个字符
第二种,字符串a向后移动一个字符,模式b上向后移动两个字符或者保持不变

例子——图解

我们可以用模式 ba*ab 来举例子,画出其非确定优先状态机图,如下:
在这里插入图片描述
当匹配进入状态2并且字符串a的字符为’a’时,有两种选择:
1、进入状态3(在模式上向后移动两个字符)
2、回到状态3(模式保存不变)

代码

代码如下:

bool match(char* str,char* pattern)
{
	if(str==nullptr || pattern==nullptr)
		return false;
	return matchCore(str,pattern);
}

bool matchCore(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 matchCore(str+1,pattern+2)
			//停留在当前状态
			|| matchCore(str+1,pattern)
			//忽略一个 '*'
			|| macthCore(str,pattern+2);
		else
			return matchCore(str,pattern+2);
	}
	if(*str==*patter || (*pattern=='.' && *str!='\0'))
		return matchCore(str+1,pattern+1);
	return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值