题目:实现支持’.’和”*”的正则表达式匹配
‘.’匹配任意一个字母
‘*’匹配0个或者多个前面的字符。
匹配应该覆盖整个输入字符串而不是仅仅一部分。如字符串“aaa”与模式”a.a”和”ab*ac*a”匹配,而与”aa.a”及”ab*a”均不匹配。
思路:首先要理解题意(想了好久才了解这个题目的意思)。这个说的是两个字符串要完全相等。意思就是判断是否能用含有’.’和”*”的字符串(我们称模式)来完全代替另一个字符串(我们称原串)。
(1)当原串为空时,显然只有模式串为空,或者具有“X*X*”的形式可以代替原串。
(2)当原串不为空,而模式串为空,显然false
(3)当原串不为空,模式串也不为空。
如果模式串第二个字符为”*”:如果模式串第一个字符与原串第一个字符相等,那么两者都可以进2;如果两者第一个字符不相等,那么只能模式串进2;
如果模式串第二个字符不为”*”:如果模式串第一个字符与原串第一个字符相等,那都可以进1;否则必然不能代替原串,返回false.
代码用递归的方式实现:
bool isMatch(string s, string p) {
// write your code here
//注意:'*'是匹配'*'之前的字符,匹配0个字符指的是前面的字符为0,即删去前面的字符
//匹配,要两个字符串完全相等。意思就是判断是否能用含有'.'或"*"的字符串代替另一个字符串
if (s.length() == 0){
// s串匹配完合法的情况只有p为空,或是 "X*X*"的形式
if (p.length() & 1) return false;
else {
for (int i = 1; i < p.length(); i += 2) {
if (p[i] != '*') return false;
}
}
return true;
}
if (p.length() == 0) return false;
if (p.length() > 1 && p[1] == '*') {
if (p[0] == '.' || s[0] == p[0]) {
return isMatch(s.substr(1), p) || isMatch(s, p.substr(2));
} else return isMatch(s, p.substr(2));
} else {
if (p[0] == '.' || s[0] == p[0]) {
return isMatch(s.substr(1), p.substr(1));
} else return false;
}
}
版权声明:本文为skyinmoon原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。