实现一个函数用来匹配包含‘. ’和‘* ’的正则表达式。模式中的字符‘. ’表示任意一个字符,而‘* ’表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。
每次从字符串里面拿出一个字符和模式中的字符去匹配,直到遇到‘\0’为止:
1.如果模式中字符是‘. ’时,‘. ’可以和字符串中任何字符匹配。
2.对于’*'匹配,问题比较复杂一些,有两种方式:
(1)匹配0个字符,那么模式向后移动2个字符,这相当于‘* ’和它前面的字符被忽略了。
(2)匹配n(n>=1)个字符,那么字符串向后移动一个字符,而模式不变或可以向后移动两个字符。
代码如下:
bool isEqual2(char *str, char *pattern)
{
//字符串匹配到尾部,返回true
if (*str == '\0' && *pattern == '\0')
return true;
//pattern已经到最后,str还没有结束,返回false
if (*str != '\0' && *pattern == '\0')
return false;
//pattern下一个字符为'*'
if (*(pattern + 1) == '*')
{
//当前字符相等,则str向后移动一位或者pattern移动2位
if (*pattern == *str || (*pattern == '.' && *str != '\0'))
return isEqual2(str + 1, pattern + 2)
|| isEqual2(str + 1, pattern)
|| isEqual2(str, pattern + 2);
//当前字符不相等,则pattern向后移动2位
else
return isEqual2(str, pattern + 2);
}
//pattern下一个字符不是'.'
//如果当前字符相等,则str和pattern都向后移动一位继续比较;否则返回false
if (*str == *pattern || (*pattern == '.' && *str != '\0'))
return isEqual2(str + 1, pattern + 1);
return false;
}
bool isEqual(char *str, char *pattern)
{
if (str == NULL || pattern == NULL)
return false;
return isEqual2(str, pattern);
}