题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:
1) str和pattern同时为空,则返回true;
2) str不为空,pattern为空,则返回false;
3) str为空,pattern不为空,这种情况下,答案不确定,如果:str == NULL, pattern = 'a*a*a*a*',那么*前面的字符出现0次的时候就是true,但是如果str == NULL,pattern = 'aa*a*a*',就是false;所以这种情况下要考虑pattern中当前字符的下一位是否是'*';
4) str 不为空,pattern也不为空,这种情况下,答案不能确定,要将str与pattern按位比较,同时在比较前要判断pattern中当前字符的下一位是否为'*';
所以,3) 和4) 和为一种,先判断pattern中当前位的下一位是否为'*' :
如果不是'*',那么就直接匹配,如果*str==*pattern或者*str != '\0'的同时*pattern == '.',那么继续比较str和pattern的下一位,即str+1 和pattern + 1;否则,返回false;
如 果 是 '*',那么分两种情况:
① 如果*str==*pattern或者*str != '\0'的同时*pattern == '.',也就是str与pattern的当前字符相同时,要看*前的字符出现的次数,如果*匹配0个字符,那么要忽略这个字符(例如str == 'a', pattern == 'a*a',这种情况下能匹配成功,前提是*匹配的a出现0次),接着比较str与pattern+2,如果*匹配1个字符,那么接着比较str+1和pattern+2,如果*匹配2个及以上字符,也就是当前字符出现次数大于等于2,那么比较str+1与pattern;
② *str==*pattern或者*str != '\0'的同时*pattern == '.'的else,就认为*前的字符出现了0次,继续比较str与pattern+2
下面是两种写法:
char *str 定义了一个字符串指针
str+1,是指a中保存的内存地址加1
class Solution {
public:
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, pattern+2) || match(str+1, pattern+2) || match(str+1, pattern);
else
return match(str, pattern+2);
}
else
{
if (*str == *pattern || (*str != '\0' && *pattern == '.'))
return match(str+1, pattern+1);
else
return false;
}
}
};
class Solution {
public:
bool match(char* str, char* pattern)
{
if (str[0] == '\0' && pattern[0] == '\0')
return true;
if (str[0] != '\0' && pattern[0] == '\0')
return false;
if (pattern[1] == '*')
{
if (str[0] == pattern[0] || (str[0] != '\0' && pattern[0] == '.'))
return match(str, pattern+2) || match(str+1, pattern+2) || match(str+1, pattern);
else
return match(str, pattern+2);
}
else
{
if (str[0] == pattern[0] || (str[0] != '\0' && pattern[0] == '.'))
return match(str+1, pattern+1);
else
return false;
}
}
};