原题题目
代码实现(首刷自解)
class Solution {
public:
bool isMatch(string s, string p) {
vector<bool> judge;
string temp;
for(const auto& chr:p)
{
if(chr != '*')
{
judge.emplace_back(false);
temp+=chr;
}
else judge.back() = true;
}
int psize = judge.size(),ssize = s.size(),flag = 0;
vector<vector<bool>> dp(psize+2,vector<bool>(ssize+2,false));
dp[0][0] = true;
for(int i=1;i<=psize;++i)
{
for(int j=1;j<=ssize;++j)
{
if(temp[i-1] == '.')
{
if(!judge[i-1])
{
if(dp[i-1][j-1]) dp[i][j] = true;
}
else if(dp[i-1][j-1] || dp[i][j-1]) dp[i][j] = dp[i][j-1] = true;
}
else
{
if(!judge[i-1])
{
if(dp[i-1][j-1] && temp[i-1] == s[j-1]) dp[i][j] = true;
}
else
{
if(dp[i-1][j-1] || dp[i][j-1])
{
dp[i][j-1] = true;
if(temp[i-1] == s[j-1]) dp[i][j] = true;
}
}
}
}
if(dp[i-1][ssize] && judge[i-1]) dp[i][ssize] = true;
}
return dp[psize][ssize];
}
};
代码实现(二刷看解 有点困难 需要多做 对动态规划的转移方程 多理解 DAY 249 C++)
class Solution {
public:
inline bool helper(const string& s,const string& p,const int& spos,const int& ppos)
{
if(!spos) return false;
if(p[ppos - 1] == '.') return true;
return p[ppos - 1] == s[spos - 1];
}
bool isMatch(string s, string p) {
int psize = p.size(),ssize = s.size();
vector<vector<int>> dp(ssize + 1,vector<int>(psize + 1,0));
dp[0][0] = 1;
for(int i = 0;i <= ssize;++i)
{
for(int j = 1;j <= psize;++j)
{
if(p[j - 1] == '*')
{
dp[i][j] |= dp[i][j-2];
if(helper(s,p,i,j - 1))
dp[i][j] |= dp[i-1][j];
}
else
{
if(helper(s,p,i,j))
dp[i][j] |= dp[i-1][j-1];
}
}
}
return dp[ssize][psize];
}
};
代码实现(三刷看解 DAY 310 C++)
class Solution {
public:
bool Helper(const string& s, const string& p, int spos, int ppos) {
if (!spos) return false;
if (p[ppos - 1] == '.') return true;
return s[spos - 1] == p[ppos - 1];
}
bool isMatch(string s, string p) {
vector<vector<bool>> dp(s.size() + 1, vector<bool>(p.size() + 1, false));
dp[0][0] = true;
for (int i = 0; i <= s.size(); ++i) {
for (int j = 1; j <= p.size(); ++j) {
if (p[j - 1] == '*') {
dp[i][j] = dp[i][j - 2];
if (!dp[i][j] && Helper(s, p, i, j - 1))
dp[i][j] = dp[i - 1][j];
} else {
if (Helper(s, p, i, j))
dp[i][j] = dp[i - 1][j - 1];
}
}
}
return dp[s.size()][p.size()];
}
};