import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String regex = br.readLine().toLowerCase().replaceAll("\\*+","*"); //将多个*替换成单个,减少时间占用 String target = br.readLine().toLowerCase(); System.out.println(check(regex, target)); } public static boolean check(String regex, String target) { // if (regex.replace("*", "").length() > target.length()) { // return false; // } int p = 0; //目标字符串指针 int i = 0;//表达式指针 for (; i < regex.length() && p < target.length(); i++) { char ch = regex.charAt(i); if (ch == '*') { //不跳过字符时 if (check(regex.substring(i + 1), target.substring(p))) { return true; } //分别跳过p->target.length()的字符,递归校验,若遇到特殊符号,表示校验失败 for (; p < target.length(); p++) { char jumpCh = target.charAt(p); //匹配到了特殊符号 if (!Character.isDigit(jumpCh) && !Character.isLetter(jumpCh)) { return false; } //跳过字符p及以前的字符继续向下匹配 if (check(regex.substring(i + 1), target.substring(p+1))) { return true; } } return false; } else if (ch == '?') { char jumpCh = target.charAt(p); //匹配到了特殊符号 if (!Character.isDigit(jumpCh) && !Character.isLetter(jumpCh)) { return false; } //跳过一个字符 p++; } else if (ch == target.charAt(p)) { //相等,进行下一个字符的匹配 p++; } else { //不相等,匹配失败 return false; } } //表达式和目标字符串有一个没用完,表示失败 if (p != target.length() || i != regex.length()) { return false; } return true; } }