import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @param pattern string字符串
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        // write code here
        if (str == null || pattern == null) {
            return false;
        }
        int m = str.length();
        int n = pattern.length();
        //dp[i][j] 表示 str[0,i-1] 字符和 pattern[0,j-1]是否匹配
        //前 i 个字符 和  pattern的前j个是否匹配
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
         
        for(int i = 2; i<= n ; i++){
            if(pattern.charAt(i-1) == '*'){
                //匹配前面任意字符,可出现多次,空字符串想要匹配成功,只能把前一个字符去掉
                dp[0][i] = dp[0][i-2];
            }
        }
        for (int i = 1; i <= m; i ++) {
            for (int j = 1; j <= n ; j++) {
               
                if (pattern.charAt(j - 1) != '*') {
                    //不是匹配前面的任意字符
                    //if 判断 匹配条件 能匹配组
                    //如果 str[i-1] == pattern[j-1] i肯定要大于0
                    //如果不相等,或者patter[j-1] = '.' 匹配任意一个字符
                    if (i > 0 && (str.charAt(i - 1) == pattern.charAt(j - 1) ||
                                  pattern.charAt(j - 1) == '.')) {
                        dp[i][j] = dp[i - 1][j - 1];
                    }
                } else {
                    //如果是 * 匹配前面任意字符 包含0次
                    if (j >= 2) {
                        //parttern j-1前面字符出现1次 str[0,i-1] 和 partenr[0, j-2] j-2只出现一次(*号代表一次)
                        if (i >= 1  &&
                                (str.charAt(i - 1) == pattern.charAt(j - 2) || pattern.charAt(j - 2) == '.')
                           ) {
                            // 如果i - 1 位置能和j-2位置匹配上,那么问题转换成看str1[0,i-2] 到 patternp[0, j-1] 因为是*是可以匹配任意字符的呀,所以是J-1
                            //能匹配上,* 号是可以让字符多出现一次所以是dp[i-1][j] 也可以不出现 dp[i][j-2]
                            dp[i][j] = dp[i - 1][j] || dp[i][j - 2];
                        } else {
                            //因为*可以匹配0次,也就是去掉前面的字符partern[j-2],看下能不能和partern[0,j-3]匹配 aadbc  aa*c
                            dp[i][j] = dp[i][j - 2];
                        }
                    }

                }
            }
        }
        return dp[m][n];
    }
}