给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例 1:输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regular-expression-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution {
public:
bool isMatch(string s, string p) {
/* if(s.size()== 0)
return (p.size()==0||(p[0]=='*'||p[1]=='\0'))?true:false;
if(p[0]!='*')
return (p[0]=='.'||p[0]==s[0])?isMatch(s.substr(1),p.substr(1)):false;
else
return isMatch(s.substr(1),p)?true:isMatch(s,p.substr(1));*/
const char* str=s.c_str();
const char* pat=p.c_str();
return wildchar_match(str,pat);
}
bool wildchar_match(const char *str, const char *pattern)
{
if (*str == NULL)
return (*pattern == NULL || (*pattern == '*' && *(pattern+1) == NULL)) ? true :
false;
if (*pattern != '*')
return (*pattern == '.' || *pattern == *str) ? wildchar_match(str+1, pattern+1) :
false;
else
return wildchar_match(str+1, pattern) ? true : wildchar_match(str, pattern+1);
}
};
网友答案:
class Solution {
public:
vector<vector<int>> memory;
int func(const string& s, int i, const string& p, int j) {
int& res = memory[i][j];
if (res != -1)
return res;
if (i == s.size() && j == p.size()) {
res = 1;
return res;
}
if (j < p.size() && p[j + 1] == '*') {
if (i == s.size()) {
res = func(s, i, p, j + 2);
} else if ((s[i] == p[j] || p[j] == '.') && (func(s, i + 1, p, j) || func(s, i + 1, p, j + 2))) {
res = 1;
} else {
res = func(s, i, p, j + 2);
}
return res;
} else if (i < s.size() && (s[i] == p[j] || p[j] == '.')) {
res = func(s, i + 1, p, j + 1);
return res;
}
res = 0;
return res;
}
bool isMatch(string s, string p) {
memory.resize(s.size() + 1);
for (int i = 0; i <= s.size(); ++i) {
memory[i] = vector<int>(p.size() + 1, -1);
}
return func(s, 0, p, 0) > 0;
}
};
作者:da-li-wang
链接:https://leetcode-cn.com/problems/regular-expression-matching/solution/c-jian-dan-di-gui-by-da-li-wang/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。