题目描述
请实现一个函数用来匹配包括 ′ . ′ '.' ′.′和 ′ ∗ ′ '*' ′∗′的正则表达式。模式中的字符 ′ . ′ '.' ′.′表示任意一个字符,而 ′ ∗ ′ '*' ′∗′表示它前面的字符可以出现任意次(包含 0 0 0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串 " a a a " "aaa" "aaa"与模式 " a . a " "a.a" "a.a"和 " a b ∗ a c ∗ a " "ab*ac*a" "ab∗ac∗a"匹配,但是与 " a a . a " "aa.a" "aa.a"和 " a b ∗ a " "ab*a" "ab∗a"均不匹配
思路:
1)首先这个正则表达式匹配指字符串能与模式中的每个字符按照规则完全进行匹配,即需要同时遍历到字符串的末尾及模式的末尾才算完全匹配
2)若某个字符不匹配则直接返回 f a l s e false false;按照规则有如下几种方式表示字符匹配成功:
- 如果模式串的下一个字符为 ∗ * ∗:如果出现接下来的情况 ( 1 ) (1) (1)当前字符串的字符与模式串中的字符匹配 ( 2 ) (2) (2)模式串的字符为 . . .且字符串没有遍历到末尾,则接下来的匹配策略就可能出现三种【 m a t c h C o r e ( s t r + 1 , p a t t e r n + 2 ) ∣ ∣ m a t c h C o r e ( s t r + 1 , p a t t e r n ) ∣ ∣ m a t c h C o r e ( s t r , p a t t e r n + 2 ) ; matchCore(str + 1, pattern + 2) || matchCore(str + 1, pattern) || matchCore(str, pattern + 2); matchCore(str+1,pattern+2)∣∣matchCore(str+1,pattern)∣∣matchCore(str,pattern+2);】,因为出现 ( 1 ) (1) (1)情况时,可以让当前匹配的字符出现任意多次,那么当出现 0 0 0次时,即为 ( s t r , p a t t e r n + 2 ) (str,pattern + 2) (str,pattern+2),当出现 1 1 1次时,即为 ( s t r + 1 , p a t t e r n + 1 ) (str + 1, pattern + 1) (str+1,pattern+1),当出现 2 2 2次或多次时,即为 ( s t r + 1 , p a t t e r n ) (str + 1, pattern) (str+1,pattern),同理 ( 2 ) (2) (2)也可以推导出结果;否则就只有一种匹配策略【 m a t c h C o r e ( s t r , p a t t e r n + 2 ) ; matchCore(str, pattern + 2); matchCore(str,pattern+2);】,因为不出现上述两种情况,则必须得让其出现 0 0 0次,那么即为 ( s t r , p a t t e r n + 2 ) (str, pattern + 2) (str,pattern+2)
- 如果模式串得字符与字符串字符相等或者模式串的字符为.且字符串的字符未到末尾,则下一个匹配的即为 ( s t r + 1 , p a t t e r n + 1 ) (str + 1, pattern + 1) (str+1,pattern+1)
class Solution {
public:
bool match(char* str, char* pattern)
{
if (str == nullptr || pattern == nullptr)
return false;
return matchCore(str, pattern);
}
bool matchCore(char* str, char* pattern) {
if (*str == '\0' && *pattern == '\0')
return true;
if (*str != '\0' && *pattern == '\0')
return false;
if (*(pattern + 1) == '*') {
if (*pattern == *str || (*pattern == '.' && *str != '\0')) {
return matchCore(str + 1, pattern + 2)
|| matchCore(str + 1, pattern)
|| matchCore(str, pattern + 2);
}
else {
return matchCore(str, pattern + 2);
}
}
if (*pattern == *str || (*pattern == '.' && *str != '\0'))
return matchCore(str + 1, pattern + 1);
return false;
}
};