更多题目请点链接:《剑指offer》目录索引
问题描述:
请实现一个函数用来匹配包含 ‘.’ 和 ’ * ‘的正则表达式。模式中的字符 ’ .’ 表示任意一个字符,而 ’ * ’ 表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a和”ab*ac*a”匹配,但与”aa.a”及”ab*a”均不匹配。
思路:
求匹配的表达式,首先就要分清楚什么情况是匹配的,什么情况是不匹配的,故先来看以下的几种情况:
1.模式字符串中不含‘ * ’ :由题可知‘ . ’可代表任意字符,故可直接进行匹配
2.模式字符串中含有‘ * ’:‘ * ’在字符串中的位置也有一特殊位置—第二个字符是‘ * ’,当第一个字符匹配,第二个是‘ * ’,又可分为以下几种情况:1)原字符串的第二个字符与’ * ‘前面字符匹配
代码:
#include"matchCore.h"
int MatchCore(const char* str,const char* model)
{
//当两个字符串比较完毕,都在结尾时即为匹配
if(*str=='\0' && *model=='\0')
return 1;
//字符串长度不同,不匹配
if(*str!='\0' && *model== '\0')
return 0;
//第二个字符是‘*’
if(*(model+1)=='*')
{
//第一个字符匹配
if(*model==*str || (*model=='.' && *str!='\0'))
{ //三种情况
return MatchCore(str+1,model)||
MatchCore(str+1,model+2)||
MatchCore(str,model+2);
}
else
{
return MatchCore(str,model+2);
}
}
if(*model==*str || (*model=='.' && *str!='\0'))
{
return MatchCore(str+1,model+1);
}
return 0;
}
int match(const char* str,const char* model)
{
//有一个为空即为不匹配
if(str==NULL || model==NULL)
return 0;
return MatchCore(str,model);
}
测试及结果:
测试代码:
#include"matchCore.h"
void Test(const char* testName, const char* string, const char* pattern)
{
if (testName != NULL)
printf("%s begins: ", testName);
if (match(string, pattern) == 1)
printf("Passed.\n");
else
printf("FAILED.\n");
}
int main()
{
Test("Test01", "", "");
Test("Test02", "", ".*");
Test("Test03", "", ".");
Test("Test04", "", "c*");
Test("Test05", "a", ".*");
Test("Test06", "a", "a.");
Test("Test07", "a", "");
Test("Test08", "a", ".");
Test("Test09", "a", "ab*");
Test("Test10", "a", "ab*a");
Test("Test11", "aa", "aa");
Test("Test12", "aa", "a*");
Test("Test13", "aa", ".*");
Test("Test14", "aa", ".");
Test("Test15", "ab", ".*");
Test("Test16", "ab", ".*");
Test("Test17", "aaa", "aa*");
Test("Test18", "aaa", "aa.a");
Test("Test19", "aaa", "a.a");
Test("Test20", "aaa", ".a");
Test("Test21", "aaa", "a*a");
Test("Test22", "aaa", "ab*a");
Test("Test23", "aaa", "ab*ac*a");
Test("Test24", "aaa", "ab*a*c*a");
Test("Test25", "aaa", ".*");
Test("Test26", "aab", "c*a*b");
Test("Test27", "aaca", "ab*a*c*a");
Test("Test28", "aaba", "ab*a*c*a");
Test("Test29", "bbbba", ".*a*a");
Test("Test30", "bcbbabab", ".*a*a");
return 0;
}
结果: