Q10正则表达式匹配 动态规划

在这里插入图片描述
原题地址

(困难题真的蛮难的,看了题解也想了好久,不是完全搞懂)
状态矩阵matrix[s_len][p_len]
初始状态,空字符是可以和空字符匹配成功的,所以[0][0]为true
第0列,由于匹配字符的子串是空,所以只有当待s的长度为0时才能匹配成功,即[0][0]=true 其他都为false就好
从状态矩阵第1列开始,即p的长度为1的子串开始.矩阵的第一列,对应字符串第0个字符,所以是判断p[j-1]字符的情况.
简单情况是p[j-1]是字母的情况,那么判断p[j-1]是否等于s[i-1]是的话,再判断上一个状态matrix[i-1][j-1]是不是true 只有满足两个条件该状态才为真,否则为假
复杂点的情况是,p[j-1]是*.号分为两种匹配方式,一个是匹配了0个,这种情况的话,matrix[i][j]=matrix[i][j-2] -2就是不管这个号组合了.如果有匹配到好几个的话,判断*前的字母与s的相应字符是否相等,(相等才可能匹配多个字符)然后这个状态就等于matrix[i-1][j]
在匹配是否相等时专门做一个函数,让.号可以与任何符号匹配都返回true就好.

class Solution {
    
    
    public boolean isMatch(String s, String p) {
    
    
        int slen = s.length();
        int plen = p.length();
        boolean [][]matrix = new boolean[slen+1][plen+1];
        matrix[0][0] = true;
        for(int i=0;i<=slen;i++){
    
    
            for(int j=1;j<=plen;j++){
    
    
                if(p.charAt(j-1)=='*'){
    
    
                    matrix[i][j] = matrix[i][j - 2];
                    if (matches(s, p, i, j - 1)) {
    
    
                        matrix[i][j] = matrix[i][j] || matrix[i - 1][j];
                    }

                }
                else{
    
    
                    if(matches(s,p,i,j)){
    
    
                       matrix[i][j] = matrix[i-1][j-1];
                    }
                }
            }
        }
        return matrix[slen][plen];
    }

    public boolean matches(String s, String p, int i, int j) {
    
    
        if(i==0)return false;
        else if(p.charAt(j-1)=='.')return true;
        else return s.charAt(i-1)==p.charAt(j-1);
    }
}

猜你喜欢

转载自blog.csdn.net/rglkt/article/details/113795736