Regular Expression Matching
/*
https://leetcode.com/problems/regular-expression-matching/
f(i, j)表示s[0..i - 1]和p[0..j - 1]是否匹配
1、p[j - 1]不为'*':
f(i, j) = f(i - 1, j - 1) && (p[j - 1] == '.' || s[i - 1] == p[j - 1])
2、p[j - 1]为'*':
f(i, j) = f(i, j - 2) || // 匹配0个字符
f(i - 1, j - 2) && (p[j - 2] == '.' || s[i - 1] == p[j - 2]) || // 匹配1个字符
f(i - 2, j - 2) && (p[j - 2] == '.' || s[i - 2..i - 1] == p[j - 2]) || // 匹配2个字符
...
f(i - 1, j) = f(i - 1, j - 2) ||
f(i - 2, j - 2) && (p[j - 2] == '.' || s[i - 2] == p[j - 2]) ||
f(i - 3, j - 2) && (p[j - 2] == '.' || s[i - 3..i - 2] == p[j - 2]) ||
...
f(i, j) = f(i, j - 2) || (f(i - 1, j) && (p[j - 2] == '.' || s[i - 1] == p[j - 2]))
*/
bool isMatch(string s, string p)
{
int i, j, m = s.size(), n = p.size();
vector<vector<bool>> f(m + 1, vector<bool>(n + 1, false));
f[0][0] = true;
for (i = 0; i <= m; ++i) {
for (j = 1; j <= n; ++j) {
if (p[j - 1] != '*') {
f[i][j] = i >= 1 && f[i - 1][j - 1] && (p[j - 1] == '.' || s[i - 1] == p[j - 1]);
} else {
f[i][j] = j >= 2 && (f[i][j - 2] || (i >= 1 && f[i - 1][j] && (p[j - 2] == '.' || s[i - 1] == p[j - 2])));
}
}
}
return f[m][n];
}
Wildcard Matching
/*
https://leetcode.com/problems/wildcard-matching/
f(i, j)表示s[0..i - 1]和p[0..j - 1]是否匹配
1、p[j - 1]不为'*':
f(i, j) = f(i - 1, j - 1) && (p[j - 1] == '?' || s[i - 1] == p[j - 1])
2、p[j - 1]为'*':
f(i, j) = f(i, j - 1) || // 匹配0个字符
f(i - 1, j - 1) || // 匹配1个字符
f(i - 2, j - 1) || // 匹配2个字符
...
f(i - 1, j) = f(i - 1, j - 1) ||
f(i - 2, j - 1) ||
f(i - 3, j - 1) ||
...
f(i, j) = f(i, j - 1) || f(i - 1, j)
*/
bool isMatch(string s, string p)
{
int i, j, m = s.size(), n = p.size();
vector<vector<bool>> f(m + 1, vector<bool>(n + 1, false));
f[0][0] = true;
for (i = 0; i <= m; ++i) {
for (j = 1; j <= n; ++j) {
if (p[j - 1] != '*') {
f[i][j] = i >= 1 && f[i - 1][j - 1] && (p[j - 1] == '?' || s[i - 1] == p[j - 1]);
} else {
f[i][j] = f[i][j - 1] || (i >= 1 && f[i - 1][j]);
}
}
}
return f[m][n];
}