描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。
1.模式中的字符'.'表示任意一个字符
2.模式中的字符'*'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
题解:
本题是典型的dp问题,创建一个n1*n2的矩阵,算随影长度str匹配的可能性。
每个dp只考虑a*代表aa/a/空,的情况(代表a的情况,在dp[i][j-1]已经判断过了),只要有一种成立,即可。
主要是代表aa那个难理解
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
bool match(string str, string pattern) {
int n1 = str.size(), n2 = pattern.size();
// dp多了个空的情况
vector<vector<bool>> dp(n1 + 1, vector<bool>(n2 + 1, false));
dp[0][0] = true;
for(int i=2; i<=n2; ++i)
{
if(pattern[i-1] == '*')
{
dp[0][i] = dp[0][i-2];
}
}
for(int i=1; i<=n1; ++i)
{
for(int j=1; j<=n2; ++j)
{
if(str[i-1] == pattern[j-1] || pattern[j-1] == '.')
{
dp[i][j] = dp[i-1][j-1];
}
else if(pattern[j-1] == '*')
{
// 0次
if(dp[i][j-2])
{
dp[i][j] = true;
}
// 1次
else if(dp[i][j-1])
{
dp[i][j] = true;
}
// 2次的情况
// dp[i-1][j] = true 意味着str0~i-2与patt0~j-1匹配,
// 而此时pattj-1为*,则看它的上一个和str的下一个
// patt*的前一个与str当前字符合适,只要str0~i-2与patt0~j-1匹配即可
else if(str[i-1] == pattern[j-2] || pattern[j-2] == '.')
{
if(dp[i-1][j])
{
dp[i][j] = true;
}
}
}
}
}
return dp[n1][n2];
}
};