【记忆化搜索】LeetCode 10. 正则表达式匹配

版权声明:Johnson https://blog.csdn.net/m0_38055352/article/details/90707340

这段时间要沉迷刷题一段时间了,就让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上费那么多时间!我保证这是我最后一次在这个平台上刷题!

如果有问题的话,请大家指正!!!

猜你喜欢

转载自blog.csdn.net/m0_38055352/article/details/90707340