这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!
一、题目大意
题目要求很简单,就是给定一个匹配串s,和一个模式串p,要求按照正则表达式的要求进行匹配,支持’.‘和’*'的匹配。
二、题目思路以及AC代码
我本来是抵制LeetCode的题的,在这里我不得不吐槽一下LeetCode的提交方式,简直是太智障了!!(我是被同学提问说要做这道题的,本身并不情愿),为什么就不能像其他OJ那样提交呢?偏自己搞一个Solution提交,把本来优化的时间复杂度都能再提上去,真的服。
回归正题,本题要求匹配正则表达式。其实思路很简单,就是按照匹配规则递归求解嘛,当然这是暴力的方法,然后优化的方法自然想到的就是记忆化搜索,用一个dp数组存储一下已经算出来的值。
下面给出AC代码:(提前声明,我的代码并没有完全按照LeetCode上的写法,因为我定义了全局变量,但大家可以参照我写的思路来解决,其中的match函数我用了记忆化搜索,结果导致时间用的更多了,我严重怀疑是因为我改到LeetCode上的时候采用了成员变量,用指针而导致时间花费的提高,代码本身并没有问题)
纯暴力
bool isMatch(string s, string p) {
int plen = p.length();
int slen = s.length();
if (!plen) return slen == 0;
char a = s[0];
char b = p[0];
bool first_match = slen && (a == b || b == '.');
if (plen >= 2 && p[1] == '*') {
return isMatch(s, p.substr(2, plen - 2)) ||
first_match && isMatch(s.substr(1, slen - 1), p);
}
else {
return first_match && isMatch(s.substr(1, slen - 1), p.substr(1, plen - 1));
}
}
记忆化搜索:
bool match(int i, int j) {
if (j >= plen) return i >= slen;
char a = s[i];
char b = p[j];
bool first_match = i < slen && (a == b || b == '.');
if (plen - j >= 2 && p[j + 1] == '*') {
dp[i][j + 2] = (dp[i][j + 2] == -1) ? match(i, j + 2) : dp[i][j + 2];
bool tmp = (first_match && ((dp[i + 1][j] == -1) ? (dp[i + 1][j] = match(i + 1, j)) : dp[i + 1][j]));
return dp[i][j + 2] || tmp;
}
else {
return (first_match && ((dp[i + 1][j + 1] == -1) ? (dp[i + 1][j + 1] = match(i + 1, j + 1)) : dp[i + 1][j + 1]));
}
}
哎,简单的一道题在LeetCode上费那么多时间!我保证这是我最后一次在这个平台上刷题!
如果有问题的话,请大家指正!!!