¥10 动态规划与字符串匹配¥ 正则表达式匹配v

1.全匹配,而不是匹配字符串的一部分

class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length();
        int n = p.length();

        boolean[][] f = new boolean[m + 1][n + 1];
        f[0][0] = true;
        for (int i = 0; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                // 初始化(0,0)=true 其他值初始化为false
                // 完善(0,1) (0,2)
                //     (1,1) (1,2)
                if (p.charAt(j - 1) == '*') {
            // p=ca*  s=b false  s[i]!=p[j-1] f[i][j]取决于j-1前的一个字符  f[i][j] = f[i][j - 2]
            // p=ba*  s=b true   s[i]!=p[j-1] f[i][j]取决于j-1前的一个字符  f[i][j] = f[i][j - 2]
            //s[i]和p[j-1],实际是s[i-1]和p[j-2]不相等,f[i][j] = f[i][j - 2]
                    f[i][j] = f[i][j - 2];          
                    if (matches(s, p, i, j - 1)) { 
            //因为比实际字符长度多了1行1列,所以这里从s,p中取字符i,j要-1           
            //s[i]和p[j-1],实际是s[i-1]和p[j-2]相等,f[i][j] = f[i][j] || f[i - 1][j];
            // 匹配 s 末尾的一个字符,将该字符扔掉,而该组合还可以继续进行匹配;

            // if条件不满足则f[i][j] = f[i][j - 2]; 
                        f[i][j] = f[i][j] || f[i - 1][j];
                    }
                } else {
                    if (matches(s, p, i, j)) {
    //因为比实际字符长度多了1行一列,所以这里从s,p中取字符i,j要-1   
    //情况1 如果p[j-1]='.',s[i-1]不论等啥都和p[i-1]匹配,则s[i-]匹配与p[j-1].
    //情况2 如果s[i-1]=p[j-1],则s[i-]匹配与p[j-1].
    //则完整的匹配结果取决于两个字符串前面的部分f[i][j] = f[i - 1][j - 1];
    //s[i-1]和p[j-1]不相等,f[i][j]为默认值false
 
                        f[i][j] = f[i - 1][j - 1];
                    }
                }
            }
        }
        return f[m][n];
    }

    public boolean matches(String s, String p, int i, int j) {
        if (i == 0) {
            return false;
        }
        if (p.charAt(j - 1) == '.') {
            return true;
        }
        return s.charAt(i - 1) == p.charAt(j - 1);
        
        //判断s中的第i-1个字符和p中的第j-1个字符是否相等
    }
}

参考

https://leetcode-cn.com/app/problems/regular-expression-matching/solution/zheng-ze-biao-da-shi-pi-pei-by-leetcode-solution/?isDark=false&rawContent=false?um_chnnl=leetcode?um_from_appkey=5fcda41c42348b56d6f8e8d5

https://leetcode-cn.com/problems/regular-expression-matching/solution/shi-pin-tu-jie-dong-tai-gui-hua-zheng-ze-biao-da-s/

猜你喜欢

转载自blog.csdn.net/qq_41557627/article/details/114272728