/*
注意考虑特殊情况,如.*,a匹配a.等情况
*/
bool match(string str, string pattern) {
// write code here
if (pattern.empty())
return str.empty();
int m = str.size(), n = pattern.size();
vector<vector<bool> > dp(m + 1, vector<bool>(n + 1)); // 定义动态规划数组
// 初始化
dp[0][0] = true;
for (int i = 2; i <= n; i += 2) {
if (pattern[i - 1] == '*')
dp[0][i] = dp[0][i - 2];
}
for (int i = 1; i <= m; i ++) {
for (int j = 1; j <= n; j ++) {
if (str[i - 1] == pattern[j - 1] || pattern[j - 1] == '.') // pattern字符串当前字符与str字符串当前字符相等,或pattern字符串当前字符为`.`
dp[i][j] = dp[i - 1][j - 1];
else if (pattern[j - 1] == '*') { // pattern字符串当前字符为`*`
if (dp[i][j - 1]) { // 星号匹配一次,匹配一次是匹配多次的特殊情况,
//先单独考虑,三种情况只要有一种满足dp[i][j]为true
dp[i][j] = dp[i][j - 1];
}
else if (j >= 2 && dp[i][j - 2]) { // 星号匹配零次
dp[i][j] = dp[i][j - 2];
}
else if (i >= 2 && j >= 2) // 星号匹配多次
dp[i][j] = (dp[i - 1][j] && (str[i - 1] == pattern[j - 2]
|| pattern[j - 2] == '.'));
}
}
}
return dp[m][n];
}
BM76 正则表达式匹配(请实现一个函数用来匹配包括‘.‘和‘*‘的正则表达式。1.模式中的字符‘.‘表示任意一个字符2.模式中的字符‘*‘表示它前面的字符可以出现任意次(包含0次)。在本题中,
最新推荐文章于 2023-07-09 09:14:51 发布