面试代码题--米哈游--正则表达式匹配--.*+

面试代码题--米哈游--正则表达式匹配--.*+

 


题目:请实现一个函数用来匹配包含'.'和'*'和'+'的正则表达式。

模式中字符'.'代表:任意一个字符

模式中字符'*'代表:它前面字符可以出现0次或者多次

模式中字符'+'代表:它前面字符可以出现1次或者多次

例如:字符串string1与模式字符串string2,string3,string4,string5:

string1 = "aaa",string2 = "a.a",string3 = "ab*ac*a",string4 = " aa.a",string5 = "ab*a"

刚开始我连匹配方法都看不懂,后来才懂它前面的字符这句话的意思,其实就是'*'或'+'与它前面的一个字符看成整体,看这一个字符出现的次数,而不是和它前面所有出现过得字符。

所以现在看string1 与模式string2 匹配,因为'.'代表任意一个字符,不妨把它看成a,这样就匹配了。

string1 与模式string3 匹配,因为'*'代表它前面字符可以出现0次或者多次,那么b*和c*就可以当成出现0次,这样就匹配了。

string1 与模式string4不 匹配,因为'.'代表任意一个字符,如果把它看成a,那string4就是"aaaa",这样就不匹配了。

string1 与模式string5不 匹配,因为'*'代表它前面字符可以出现0次或者多次,那么b*就可以当成出现0次,因为该匹配的是a,string5就是"aa",这样就不匹配。

代码如下:

#include <stdio.h>
#include <string>
#include <iostream>
#include <vector>
using namespace std;

bool Pipei(string &s,string &p,int i,int j)
{
	int lenght1 = s.size();
	int lenght2 = p.size();
	if(i == lenght1 && j == lenght2)
	{
		return true;
	}
	if(i != lenght1 && j == lenght2)
	{
		return false;
	}

	if(p[j+1] == '*')
	{
		if(p[j] == s[i] ||( p[j] == '.' && i != lenght1))
		{
			return Pipei(s,p,i+1,j+2) ||Pipei(s,p,i+1,j)||Pipei(s,p,i,j+2);
		}
		else
		{
		    return Pipei(s,p,i+1,j+2) ;
		}
	}
	else if(p[j+1] == '+')
	{
		if(p[j] == s[i] ||( p[j] == '.' && i != lenght1))
		{
			return Pipei(s,p,i+1,j+2) ||Pipei(s,p,i+1,j)||Pipei(s,p,i,j+2);
		}
		else
		{
		    return false;
		}
	}
	if(p[j] == s[i] ||(p[j] == '.' && i != lenght1))
	{	return  Pipei(s,p,i+1,j+1) ;
	}
	return false;
}
int main()
{
	string string1;
	string p1; 
	cin >> string1 >> p1;
	if(Pipei(string1,p1,0,0))
	{
		cout<<true<<endl;
	}
	else
	{
		cout<<false<<endl;
	}
}

结果1:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值