题目:
匹配包括"."和"*"的正则表达式,"."表示任意一个字符,"*"表示其前面的字符可以出现任意次(包括0次)。比如,"aaa"与"a.a"和"ab*ac*a"匹配,但是与"aa.a" "ab*a"不匹配。
解决思路:
(1)递归实现
(2)从两字符串头开始遍历,当前字符相同或是当前有字符为“.”,说明当前字符匹配,就指针后移,继续判断;
(3)若遇到“*”号,只要*前有一个字符相同,就可才能够*号后面继续比较;
实现代码:
#include <stdio.h>
#include <assert.h>
int _StringMate(const char* str, const char* arr)
{
if (*str == '\0' && *arr == '\0')//结束条件,匹配成功
return 1;
if (*str != '\0' && *arr == '\0')//结束条件,匹配失败
return 0;
if (*(arr + 1) == '*')
{
if ((*str == *arr) || (*arr == '.' && *str != '\0'))
return _StringMate(str + 1, arr)\//匹配多次
|| _StringMate(str, arr + 2)\//匹配0次
|| _StringMate(str+1, arr+2);//匹配1次
else
return _StringMate(str, arr + 2);
}
if (*str == *arr || (*arr == '.' && *str != '\0'))//当前字符匹配成功
return _StringMate(str + 1, arr + 1);
return 0;
}
int StringMate(const char* str, const char* arr)
{
if (str == NULL || arr == NULL)
return 0;
return _StringMate(str, arr);
}
int main()
{
char* str = "aaa";
char* arr1 = "a.a";
char* arr2 = "ab*ac*a";
char* arr3 = "aa.a";
char* arr4 = "ab*a";
int ret1 = StringMate(str, arr1);
int ret2 = StringMate(str, arr2);
int ret3 = StringMate(str, arr3);
int ret4 = StringMate(str, arr4);
printf("expected is 1 1 0 0, actual is %d %d %d %d\n", ret1, ret2, ret3, ret4);
system("pause");
return 0;
}