题目描述
请实现一个函数用来匹配包括 . 和 ※ 的正则表达式。模式中的字符’.'表示任意一个字符,而※表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。
用递归的思路还是挺好理解的:
分为两种情况:
1.该字符后面不是※。那对应位置必须得匹配。否则返回false。
2.该字符后面是※。又要分情况:
(1)如果与这个字符不匹配:那就跳过两个
(2)如果与这个字符匹配:分为三种情况:不匹配,匹配一个,匹配多个。
当然也要有递归出口。
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
//分情况讨论
/*
如果后面的字符不为*:那这一位必须匹配
如果后面的字符为*:分三种情况:
直接跳过
匹配一个
匹配多个
*/
bool match(char* str, char* pattern)
{
//递归出口
if (*str == '\0' && *pattern == '\0')
{
return true;
}
if (*str != '\0' && *pattern == '\0')
{
return false;
}
if (*(pattern + 1) != '*')
{
if (*str == *pattern || (*str!='\0' && *pattern == '.'))
{
return match(str + 1, pattern + 1);
}
else
{
return false;
}
}
else if (*(pattern + 1) == '*')
{
if (*str == *pattern || (*str != '\0' && *pattern == '.'))
{
return match(str, pattern + 2) || match(str + 1, pattern + 2) || match(str + 1, pattern);
}
else
{
return match(str, pattern + 2);
}
}
}
int main()
{
char str[] = "aaa";
char pattern[] = "abac*a";
if (match(str, pattern))
{
cout << true << endl;
}
else
{
cout << false << endl;
}
}