【力扣T10】正则表达式匹配
作者:互联网
题干
数据范围
解析
一道经典的线性dp
状态:dp[i][j]表示s的1-i和p的1-j是否匹配
状态转移:依据第j个位置是否为星号进行分类:
如果为星号,则看跳过a*,跳到j-2对应位置和i位置匹配或者让i-1和j匹配再让i和j-1匹配。
如果不为星号,则转化为前i-1和前j-1匹配且i和j匹配
class Solution {
public:
bool isMatch(string s, string p) {
int n=s.size(),m=p.size();
s=' '+s,p=' '+p;
vector<vector<bool>> f(n+1,vector<bool>(m+1));
f[0][0]=true;
for(int i=0;i<=n;i++){
for(int j=1;j<=m;j++){
if(j+1<=m&&p[j+1]=='*') continue;
else if(i&&p[j]!='*'){
f[i][j]=f[i-1][j-1]&&(s[i]==p[j]||p[j]=='.');
}
else if(p[j]=='*'){
f[i][j]=f[i][j-2]||i&&f[i-1][j]&&(s[i]==p[j-1]||p[j-1]=='.');
}
}
}
return f[n][m];
}
};
dp很吃经验,最长公共子序列,最长上升子序列,还有这个正则表达式匹配。状态如何设,是需要经验积累的。见得多了也就培养出“思维直觉”了。
标签:匹配,string,正则表达式,力扣,int,T10,&&,星号,dp 来源: https://blog.csdn.net/qq_50757994/article/details/119462383