public boolean f(int i, int j) {
        String key = i + "," + j;
        Boolean result = m.get(key);
        if (result == null) {
            if (i==0) {
                result = j==0;
            } else if (j==0) {
                result = p.charAt(i-1)=='*' && f(i-1, 0);
            } else {
                char cp = p.charAt(i-1);
                if (cp=='*') {
                    result = f(i-1, j) || f(i, j-1);
                } else if (cp=='?') {
                    result = f(i-1, j-1);
                } else {
                    result = cp==s.charAt(j-1) && f(i-1, j-1);
                }
            }
            
            m.put(key, result);
        }
        return result;
    }