leetcode-正则表达式匹配(动态规划)-75

Posted 天津 唐秙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-正则表达式匹配(动态规划)-75相关的知识,希望对你有一定的参考价值。

题目要求
  请实现一个函数用来匹配包含’. ‘和’ * ’ 的正则表达式。模式中的字符’.‘表示任意一个字符,而’* '表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。
解析
  这个题的转移方程如下图1所示,但是里面存在j-2,那么数组就有可能越界,这个问题不是很好解决,最终阅读了参考答案,将转移方程的判断条件用一个lambda表达式代替,算是勉强解决吧,不过也存在一个小小的bug,就是s串为aa,p串为 * ,这个代码还是会越界。(后面附上我的代码和测试用例)
图解

代码实现

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Solution {
public:
	bool isMatch(string s, string p) {
		int m = s.size();
		int n = p.size();

		auto matches = [&](int i, int j) {
			if (i == 0) {
				return false;
			}
			if (p[j - 1] == '.') {
				return true;
			}
			return s[i - 1] == p[j - 1];
		};

		vector<vector<int>> f(m + 1, vector<int>(n + 1));
		f[0][0] = true;
		for (int i = 0; i <= m; ++i) {
			for (int j = 1; j <= n; ++j) {
				if (p[j - 1] == '*') {
					f[i][j] |= f[i][j - 2];
					if (matches(i, j - 1)) {
						f[i][j] |= f[i - 1][j];
					}
				}
				else {
					if (matches(i, j)) {
						f[i][j] |= f[i - 1][j - 1];
					}
				}
			}
		}

		return f[m][n];
	}
};

int main()
{
	string str1 = "aa";
	string str2 = "a*";
	Solution a;
	int ret = a.isMatch(str1, str2);
	cout << ret << endl;

	return 0;
}

以上是关于leetcode-正则表达式匹配(动态规划)-75的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 10 regular expression matching (正则表达式匹配) (动态规划)

⭐算法入门⭐《动态规划 - 串匹配》困难01 —— LeetCode 10. 正则表达式匹配

动态规划之正则表达式匹配字符串

深度解析「正则表达式匹配」:从暴力解法到动态规划

LeetCode——正则表达式匹配

leetcode 正则表达式匹配 困难