Espada se refiere a la oferta 19. Coincidencia de expresiones regulares

Espada se refiere a la oferta 19. Coincidencia de expresiones regulares

Descripción del Título

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Ideas para resolver problemas

Programación dinámica

Inserte la descripción de la imagen aquí

class Solution {
    
    
    public boolean isMatch(String s, String p) {
    
    
        int sLength = s.length(), pLength = p.length();
        //定义:dp[i][j]表示 s[0...i-1] 和 p[0...j-1] 能否匹配
        boolean[][] dp = new boolean[sLength + 1][pLength + 1];
        //base case
        //dp[0][0] = true, dp[i][0] = false
        dp[0][0] = true;
        //对于dp[0][j],要讨论 p 是否为 a*b*c* 这种格式,即所有的 * 全部匹配0次,如果是这种格式则为true,否则为false
        for (int j = 1; j <= pLength; j++) {
    
    
            //只有当 j 为偶数,且 p[j - 1] 为 * 时才有可能满足格式
            if ((j & 1) == 0 && p.charAt(j - 1) == '*') {
    
    
                dp[0][j] = dp[0][j - 2];
            }
        }

        for (int i = 1; i <= sLength; i++) {
    
    
            for (int j = 1; j <= pLength; j++) {
    
    
                if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.') {
    
    
                    dp[i][j] = dp[i - 1][j - 1];  //匹配1次
                } else if (p.charAt(j - 1) == '*') {
    
    
                    if (s.charAt(i - 1) != p.charAt(j - 2) && p.charAt(j - 2) != '.') {
    
    
                        dp[i][j] = dp[i][j - 2];   //匹配0次
                    } else {
    
    
                        dp[i][j] = dp[i][j - 2] || dp[i - 1][j];  //匹配0次或多次
                    }
                } else {
    
    
                    dp[i][j] = false;
                }
            }
        }

        return dp[sLength][pLength];
    }
}

Supongo que te gusta

Origin blog.csdn.net/cys975900334/article/details/114933817
Recomendado
Clasificación