面试代码题--米哈游--正则表达式匹配--.*+
题目:请实现一个函数用来匹配包含'.'和'*'和'+'的正则表达式。
模式中字符'.'代表:任意一个字符
模式中字符'*'代表:它前面字符可以出现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: