思路:
递归。时间复杂度O(N),空间复杂度O(1)。
* 代表可以匹配 0个 或 多个 前导字符;
. 代表可以匹配任意一个字符;
如果p[i]匹配到了最后的'\0',这是s[i]也到最后的'\0' ,则匹配成功,否则,失败;
如果没到最后,且如果 当前字符的下一个字符不是 * ,必须一一匹配;
如果没到最后,且如果 当前字符是 * ,看 * 的作用是1次or多次是否可以匹配;
最后,看* 的作用是0次是否匹配;
class Solution {
private:
bool matchHelper(string &s, string &p, int i, int j) {
if(p[j] == '\0') {
return s[i] == '\0';
}
if(p[j+1] != '*') {
if((s[i] == p[j]) || (p[j] == '.' && s[i] != '\0')) {
return matchHelper(s, p, i+1, j+1);
}else {
return false;
}
}
while((s[i] == p[j]) || (p[j] == '.' && s[i] != '\0')) {
if(matchHelper(s, p, i, j+2)) {
return true;
}
++i;
}
return matchHelper(s, p, i, j+2);
}
public:
bool isMatch(string s, string p) {
return matchHelper(s, p, 0, 0);
}
};
本文介绍了一种使用递归实现的正则表达式匹配算法,该算法能处理包括'*'在内的特殊字符,并详细解释了匹配过程中的各种情况判断与递归调用逻辑。
468

被折叠的 条评论
为什么被折叠?



