力扣算法篇:正则表达式匹配
正则表达式配:给你一个字符串s和一个字符规律p,请你来实现一个支持’.‘和’'的正则表达式匹配。
'.'匹配任意单个字符
''匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串s 的,而不是部分字符串。
实例:
题解:递归法求解
class Solution {
public:
bool isMatch(string s, string p) {
//正则表达式匹配 支持"."和"*"
//得到字符串和匹配规则的长度
int sl = s.length();
int pl = p.length();
//匹配规则为空
if(pl == 0){
//并且是空串
if(sl == 0){
return true;
}
//不是空串
return false;
}
//匹配规则不为空 字符串为空
//匹配成功只有一种情况:即匹配规则字符数为偶数且是字符和*的组合
if(sl == 0){
//匹配规则字符数为奇数
if(pl%2 == 1){
//必定不匹配
return false;
}
//匹配规则字符为偶数 看偶数个字符是不是*
int i = 1;
while(i<pl){
if(p[i] != '*'){
//必定不匹配
return false;
}
//为* 继续查看下一个偶数字符
i += 2;
}
//除了循环说明偶数字符都是* 则必定匹配
return true;
}
//字符串不为空
//取出字符串和匹配规则的第一个字符
char s0 = s[0];
char p0 = p[0];
//查看匹配规则的第二个字符 如果有的话
char p1 = (pl>1)?p[1]:0;
//如果匹配规则的第二个字符不是*
if(p1 != '*'){
//查看第一个字符串和匹配规则的第一个字符匹不匹配
if(s0!=p0 && p0!='.'){
//不匹配
return false;
}
//然后递归
return isMatch(s.substr(1),p.substr(1));
}
//如果匹配规则的第二个字符是*
// 则字符串第一个字符和匹配规则第一个字符可以不等 匹配0个
if(s0!=p0 && p0!='.'){
//s不动 p动
return isMatch(s,p.substr(2));
}
//否则 匹配规则第一个字符为'.' 那么可以是匹配0个 或者是1个(体现在递归中是多个)
return isMatch(s.substr(1),p) || isMatch(s,p.substr(2));
}
};