import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @param p string字符串
     * @return bool布尔型
     */
    public boolean is_match(String s, String p) {
        int m = s.length();
        int n = p.length();
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        // 初始化dp[0][j]
        for (int j = 1; j <= n; j++) {
            if (p.charAt(j - 1) == '*') {
                dp[0][j] = dp[0][j - 2];
            }
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 如果p字符串此时是.号或者 从两个字符串中取出的字符是相等的,那么就只要各自保存前一个值的状态,如果前面为true,则为true
                if (p.charAt(j - 1) == '.' || p.charAt(j - 1) == s.charAt(i - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else if (p.charAt(j - 1) == '*') {
                    // 将 * 视作 0次的情况,相当于忽略前一个字符
                    dp[i][j] = dp[i][j - 2];
                    // 如果j-1=* j-2=.那么只要dp[i-1][j]为真,那么就是真
                    // 或者 j-1=* 并且 s的第i-1个字符和p的j-2个字符相等 那么同理,dp[i-1][j]为真就能匹配
                    if (p.charAt(j - 2) == '.' || p.charAt(j - 2) == s.charAt(i - 1)) {
                        dp[i][j] |= dp[i - 1][j];
                    }
                }
            }
        }
        return dp[m][n];
    }
}

本题知识点分析:

1.动态规划

2.数学模拟

3.数组遍历

本题解题思路分析:

1.利用dp数组创建boolean 二维数组 行列分别代表s数组和n数组

2.初始化dp[0][j],因为如果p数组存在*的情况,那么其实可以进行初始化,*可以代表出现0次,那么0的时候的状态可以被传递给2,4,.....之类的2的倍数

3.然后根据数学模拟进行分类

4.如果p字符串此时是.号或者 从两个字符串中取出的字符是相等的,那么就只要各自保存前一个值的状态,如果前面为true,则为true

5.如果出现*号, 将 * 视作 0次的情况,相当于忽略前一个字符

6.如果j-1=* j-2=.那么只要dp[i-1][j]为真,那么就是真 或者 j-1=* 并且 s的第i-1个字符和p的j-2个字符相等 那么同理,dp[i-1][j]为真就能匹配

本题使用编程语言: Java

如果你觉得本题对你有帮助的话,可以点个赞支持一下,感谢~