Regular Expression Matching (Hard)
问题描述
关于此题正则表达式有三点要求
'.' 代表任何字符
'*' 代表上一个字符可以有 大于等于零 个
正则匹配必须 全部覆盖,也就是说不是平常的局部覆盖
Examples
isMatch("aa", "a") → false
isMatch("aa", "aa") → true
isMatch("aaa", "aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "cab") → true
算法思路
主要的实现思想是 递归,就是一大堆逻辑,设待匹配字符串为 s,正则表达式为 reg
当 reg 为空时, s 必须也为空,才匹配成功
当 reg 只有一个字符时,s 必须也只有一个字符,并且要么 reg 和 s 相等,要么 reg 为 '.'
-
当 reg 下一个字符为 普通字符 时
首先 s 肯定不能为空
要么 reg 和 s 相等,要么 reg 为 '.'
再对下一个字符进行匹配
-
当 reg 下一个字符为 '*' 时
要么 reg 和 s 相等,要么 reg 为 '.'
如果 '*' 之后的正则匹配不成功,那么 s 肯定是被忽略了
再对 '*' 后的字符进行匹配
AC 代码
bool isMatch(string s, string p) {
if (p.length() == 0) {
return s.length() == 0;
}
if (p.length() == 1) {
return (s.length() == 1) && (s[0] == p[0] || p[0] == '.');
}
if (p[1] != '*') {
if (s.length() == 0) {
return false;
} else {
return (s[0] == p[0] || p[0] == '.')
&& isMatch(s.substr(1), p.substr(1));
}
} else {
while (s.length() > 0 && (s[0] == p[0] || p[0] == '.')) {
if (isMatch(s, p.substr(2))) {
return true;
}
s = s.substr(1);
}
return isMatch(s, p.substr(2));
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。