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 (正则表达式匹配) (动态规划)