题目:正则表达式匹配
原题链接:正则表达式匹配
自己尝试:
自己也尝试了一段时间,纯粹是硬想,既没有使用递归,也没有用DP,总是有一些测试用例无法通过,下面是自己的代码,仅用于纪念(下面代码不能AC)
class Solution {
public:
bool isMatch(string s, string p) {
int i = 0, j = 0;
while(i < s.size() && j < p.size()){
if(s[i] == p[j]){
i++;
j++;
}
else{
if(p[j] == '.'){
i++;
j++;
}
else if(p[j] == '*'){
if(p[j - 1] == s[i] || p[j - 1] == '.'){
while(s[i] == s[i + 1] && i + 1 < s.size()) i++;
i++;
j++;
}
else return false;
}
else if(p[j + 1] == '*'){
j += 2;
}
else return false;
}
}
if(i < s.size() || j < p.size()) return false;
else return true;
}
};
结果:
递归解法:
在题解区看到了一个递归解法,相当简洁优雅,而且也不难理解,代码如下:
class Solution {
public:
bool isMatch(string s, string p) {
if(p.empty()) return s.empty();
if(p[1] == '*')
return isMatch(s, p.substr(2)) || ((!s.empty() && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1),p)));
else
return !s.empty() && (s[0] == p[0] || '.' == p[0]) && (isMatch(s.substr(1), p.substr(1)));
}
};
原答案链接:正则表达式匹配 c++实现两种解法 递归法和动态规划法 图示讲解
天秀解法:
看题解区还碰到了一位天秀兄弟,一行代码(调库)解决问题,直接可以AC的哦。虽然不是目的,但是让我这个没见过这种用法的小白开了眼,分享给大家:
class Solution {
public:
bool isMatch(string s, string p) {
return regex_match(s, regex(p));
}
};
原答案链接:我是来搞笑的,我调库,我光荣(狗头)
题外话:
日常的生活中也有这样的重复规律,星期,四季,节日,年份。一种幸福的生活应该懂得如何在这些重复的模子中度过而不感到闭塞。
——米歇尔·图尼埃