题目:字符串与正则表达式式的匹配
题目说明:
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
a* 理解为[0,+oo]个a
.* 理解为[0,+oo]个. '....~~....'//可以匹配任意的字符串
*前必须有明确的单个字符
所以出现**直接返回error。
代码:
//leetcode 10
bool isMatch(string str, string pattern){
int len1 = str.size();
int len2 = pattern.size();
if (len2 && pattern[0] == '*')
return false;
vector<vector<bool>>flag(len1 + 1, vector<bool>(len2 + 1, false));
flag[0][0] = true;
for (int i = 1; i <= len2; ++i) {
if (pattern[i - 1] == '*')
flag[0][i] = flag[0][i - 1] || flag[0][i - 2];
}
for (int i = 1; i <= len1; ++i) {
for (int j = 1; j <= len2; ++j) {
if ((pattern[j - 1] == str[i - 1]) || (pattern[j - 1] == '.'))
flag[i][j] = flag[i - 1][j - 1];
else if (pattern[j - 1] == '*') {
if ((str[i - 1] == pattern[j - 2]) || (pattern[j - 2] == '.')) {
flag[i][j] = (flag[i][j - 2] || flag[i][j - 1] || flag[i - 1][j]);
}
else {
flag[i][j] = flag[i][j - 2];
}
}
else {
flag[i][j] = false;
}
}
}
return flag[len1][len2];
}