简洁易懂讲清原理,讲不清你来打我~
输入两个字符串,第二个字符串经过正则表达后,是否能等于第一个字符串
动态规划
简单的思路
s前i个字符和p前j个字符具有某种递推关系
精准的定义
dp ij是s中0到i-1的字符串等不等于p中0到j-1的字符串
s i-1 、p j-1是s中第i个字符,p中第j-1个字符
初始化
dp 0 0是
无
_ _ _ * dp0 j =dp 0 j-2
递推
_ _ _ 1
_ _ _ 1 dp i j=dp i-1 j-1
_ _ _ 1
_ _ 2 * dpi j=dp i j-2
_ _ _ 1
_ _ 1 * dp i j=dp i j-2 (不匹配)或dp i-1 j(匹配),1可以换成.
class Solution {
public:
bool isMatch(string s, string p) {
int n=s.size(),m=p.size();
if(n==0||m==0)return false;
bool dp[n+1][m+1];
memset(dp,0,sizeof(dp));
//s中0到-1,p中0到-1个字符串匹配,也就是空字符串
dp[0][0]=true;
for(int j=2;j<=m;j++){
if(p[j-1]=='*'){
//s中0到-1,p中0到1,可以从0到-1转换
dp[0][j]=dp[0][j-2];
}
}
//dp ij是s中0到i-1的字符串等不等于p中0到j-1的字符串
//s i-1 p j-1是s中第i、p中第j个字符
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i-1]==p[j-1]||p[j-1]=='.'){
dp[i][j]=dp[i-1][j-1];
}
else if(p[j-1]=='*'){
if(s[i-1]!=p[j-2]&&p[j-2]!='.')dp[i][j]=dp[i][j-2];
else dp[i][j]=dp[i][j-2]||dp[i-1][j];
}
}
}
return dp[n][m];
}
};
踩过的坑
10* 可以匹配1
dp ij是s中0到i-1的字符串但s i-1 p j-1是s中第i、p中第j个字符
s中0到0并不是空字符串,s中0到-1,p中0到-1个字符串匹配,也就是空字符串
递推关系必须举例子
1
喜欢简洁易懂还能讲清楚原理博客的小伙伴就关注关注这个非常高产的博主呀,下次再会~