题目返回true和false,即解决可行不可行问题,脑海中首先浮现的是可以使用动态规划的方法,那么也可以使用递归的方法。然而。。。却写不出方程式(o(╥﹏╥)o)
想了几分钟,回归了关于动态规划的笔记(观看B站上讲解时做的),还是没有啥思路。就果断看大佬们的做法了。参考链接:https://blog.csdn.net/qq_40280096/article/details/82117696
终于想明白了方程式的写法
方程写出来后,临界条件要注意,若返回为真,p为空,s一定为空。s为空时,p不一定为空(.*)
递归:
class Solution {
public:
bool isMatch(string s, string p) {//通过substr,让每次的比较只集中在前两个字符
if(p.empty()) return s.empty();
if(p[1]=='*') return (isMatch(s,p.substr(2)) || ((p[0]==s[0]||p[0]=='.')&&!s.empty()&&isMatch(s.substr(1),p)));
else return !s.empty()&&(p[0]==s[0]||p[0]=='.') && isMatch(s.substr(1),p.substr(1));
}
};
DP:
class Solution {
public:
bool isMatch(string s, string p) {
int l1 = s.size();
int l2 = p.size();
vector<vector<bool>> dp(l1+1,vector<bool>(l2+1,false));
dp[0][0] = true;//只有空串才能匹配空串
for(int j=1;j<=l2;j++){
dp[0][j] = j>1 && p[j-1]=='*'&&dp[0][j-2];
}
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(p[j-1]!='*'){
dp[i][j] = (s[i-1]==p[j-1]||p[j-1]=='.') && dp[i-1][j-1];
}else{
dp[i][j] = (j>1&&dp[i][j-2]) || (s[i-1]==p[j-2]||p[j-2]=='.')&&dp[i-1][j];//这里i-1相当于递归时的i+1
}
}
}
return dp[l1][l2];
}
};