import "strconv"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 
 * @param pattern string字符串 
 * @return bool布尔型
*/
func match( s string ,  p string ) bool {
    return dp(s, 0, p, 0)
}
func dp(s string,  i int, p string, j int) bool {
    m, n := len(s), len(p)
    if j == n {
        return i == m
    }
    if i == m {
        if (n-j) % 2 == 1 {
            return false
        }
        for ; j + 1 < n; j += 2 {
            if p[j+1] != '*' {
                return false
            }
        }
        return true    
    }
    key := strconv.Itoa(i) + "," + strconv.Itoa(j)
    memo := map[string]bool{}
    if memo[key] == true {
        return memo[key]
    }
    res := false
    if s[i] == p[j] || p[j] == '.' {
        if j + 1 < n && p[j+1] == '*' {
            res = dp(s, i, p, j+2) || dp(s, i+1, p, j)
        }else {
            res = dp(s, i+1, p, j+1)
        }
    }else {
        if j + 1 < n && p[j+1] == '*' {
            res = dp(s, i, p, j+2)
        }else {
            return false
        }
    }
    memo[key] = res
    return res
}