10正则表达式匹配

以一个例子详解动态规划转移方程:
S = abbbbc
P = ab* d*c
当 i, j 指向的字符均为字母(或 ‘.’ 可以看成一个特殊的字母)时,
只需判断对应位置的字符即可,
若相等,只需判断 i,j 之前的字符串是否匹配即可,转化为子问题 f[i-1][j-1].
若不等,则当前的 i,j 肯定不能匹配,为 false.

如果当前 j 指向的字符为 ’ *’,则不妨把类似 ‘a *’, ‘b *’ 等的当成整体看待。
本质上只会有两种情况:
匹配 S 末尾的一个字符,将该字符扔掉,而该组合还可以继续进行匹配;
不匹配字符,将该组合扔掉,不再进行匹配。

状态转移方程:
10正则表达式匹配

class Solution {
public:
    bool isMatch(string s, string p) {
        int ns = s.length();
        int np = p.length();
        //int dp[ns+1][np+1];
        vector<vector<int>> dp(ns + 1, vector<int>(np + 1));
        dp[0][0]=true;
         for(int i=1;i<=np;i++){
            if(i-2>=0&&p[i-1]=='*'&&p[i-2]) {
                dp[0][i]=dp[0][i-2];
            }
        }
        for(int i=1;i<=ns;i++){
            for(int j=1;j<=np;j++){
                if(p[j-1] == s[i-1] || p[j-1] == '.')
                    dp[i][j] |= dp[i-1][j-1];
                if(p[j-1]=='*'){
                    dp[i][j] |= dp[i][j-2];
                    if(p[j-2] == s[i-1] || p[j-2] == '.'){
                        dp[i][j] |= dp[i-1][j];
                    }
                }
            }
        }
        return dp[ns][np];
    }
};
上一篇:Flutter之Align


下一篇:Json序列化在golang中的应用