其他分享
首页 > 其他分享> > 【力扣T10】正则表达式匹配

【力扣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