import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s = in.next();
        String p = in.next();
        s = s.toLowerCase();
        p = p.toLowerCase();
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i < s.length();i++){
            if(s.charAt(i) == '*' ){
                if(i == s.length() - 1)sb.append(s.charAt(i));
                else if(s.charAt(i+1) == '*')continue;
                else sb.append(s.charAt(i));
            }
            else sb.append(s.charAt(i));
        }
        System.out.print(match(sb.toString(),p));
    }
    public static boolean match(String s,String p){
        //同时结束返回true,有一个先结束返回false
        if(p.length() == 0){
            //考虑末尾有*
            if(s.length() == 0) return true;
            else if(s.charAt(0) == '*') return match(s.substring(1),p);
            else return false;
        }
        if(s.length() == 0 && p.length() != 0)return false;
        char c = s.charAt(0);
        switch(c){
            case '?':{
                return match(s.substring(1),p.substring(1));
            }
            case '*':{
                char p0 = p.charAt(0);
                if((p0 >= '0'&& p0 <= '9')||(p0 >='a' && p0 <= 'z')){
                    //*无法匹配特殊字符
                    return match(s.substring(1),p) || match(s.substring(1),p.substring(1))|| match(s,p.substring(1));
                }
                else return false;
            }
            default:{
                if(c != p.charAt(0))return false;
                else return match(s.substring(1),p.substring(1));
            }
        }
    }
}

递归的JAVA实现,额外增加大小写转换,末尾存在*的case

将多个连续*合并降低时间复杂度