实现支持'.'和'*'的正则表达式匹配。
'.'匹配任意一个字母。
'*'匹配零个或者多个前面的元素。
匹配应该覆盖整个输入字符串,而不仅仅是一部分。
需要实现的函数是:bool isMatch(const char *s, const char *p)
思路:
逐字匹配,遇到*号递归搜索所有可能的情况看是否匹配
可能有优化算法
class Solution {
public:
/**
* @param s: A string
* @param p: A string includes "." and "*"
* @return: A boolean
*/
bool isMatch(const char *s, const char *p) {
// write your code here
int ls = strlen(s);
int lp = strlen(p);
return sub(ls, lp, 0, 0, s, p);
}
bool sub(int ls, int lp, int ps, int pp, const char *s, const char *p)
{
while(ps < ls && pp < lp) {
int c = p[pp];
if(c == '*') { //处理*
char pre = p[pp - 1];
++pp;
if(sub(ls, lp, ps, pp, s, p)) return true;
for(; ps < ls; ++ps) {
if(pre == '.' || pre == s[ps]) {
if(sub(ls, lp, ps + 1, pp, s, p)) return true;
}else {
return false;
}
//++ps;
}
return false;
}if(pp + 1 >= lp || p[pp + 1] != '*') { //处理单个字符
if(c != '.' && c != s[ps]) {
return false;
}else {
++pp;
++ps;
}
}else { //后面跟*的单个字符则跳过
++pp;
}
}
if(ps == ls && pp == lp) {
return true;
}else {
return false;
}
}
};