1. 递归调用
class Solution {
public:
bool isMatch(string s, string p) {
return isMatch(s.c_str(), p.c_str());
}
bool isMatch(const char* s, const char* p) {
if(*p == 0) return *s == 0;
//判断第一个元素是否相同
auto first_match = *s && (*s == *p || *p == '.');
//当有元素为*的情况
if(*(p+1) == '*'){
return isMatch(s, p+2) || (first_match && isMatch(++s, p));
}
//其他情况
else{
return first_match && isMatch(++s, ++p);
}
}
};
2. 动态规划
class Solution {
public:
bool first_Match(string s, string p, int i, int j) {
return s[i] == p[j] || p[j] == '.';
}
bool isMatch(string s, string p) {
vector<vector<bool>> dp(s.size()+1, vector<bool>(p.size()+1));
dp[0][0] = true;
for(int j = 2;j <= p.size(); j++)
{
dp[0][j] = (p[j-1] == '*' && dp[0][j-2]);
}
for(int i = 0;i<s.size();i++)
{
for(int j = 0;j<p.size(); j++)
{
if(p[j] == '*')
{
dp[i+1][j+1] = dp[i+1][j-1] || (first_Match(s,p,i,j-1) && dp[i][j+1]);
}
else
{
dp[i+1][j+1] = first_Match(s,p,i,j) &&dp[i][j];
}
}
}
return dp[s.size()][p.size()];
}
};