I used DP Bottom Up
import java.util.*;
public class Main
{
public static void main(String [] args) throws Exception
{
Scanner s = new Scanner(System.in);
String input = "";
if(s.hasNextLine())
input = s.nextLine();
String str, pattern;
if(input == "")
{
str = "";
pattern = "";
}
else
{
String [] g = input.split(" ");
str = g[0];
if(g.length > 1)
pattern = g[1];
else
pattern = "";
}
if(matching(str,pattern))
System.out.println("1");
else
System.out.println("0");
}
public static boolean matching(String s, String p)
{
int m = s.length();
int n = p.length();
boolean [][] strg = new boolean[m+1][n+1];
for(int vidx1 = m; vidx1 >= 0; vidx1--)
{
for(int vidx2 = n; vidx2 >= 0; vidx2--)
{
if(vidx1 == m && vidx2 == n)
strg[vidx1][vidx2] = true;
else if(vidx2 == n)
strg[vidx1][vidx2] = false;
else if(vidx1 == m)
{
int i;
for(i = vidx2; i < n; i++)
{
if(p.charAt(i) != '*')
break;
}
if(i == n)
strg[vidx1][vidx2] = true;
else
strg[vidx1][vidx2] = false;
}
else if(s.charAt(vidx1) == p.charAt(vidx2) || p.charAt(vidx2) == '?')
strg[vidx1][vidx2] = strg[vidx1 + 1][vidx2 + 1];
else if(p.charAt(vidx2) == '*')
{
boolean fp = strg[vidx1][vidx2 + 1];
boolean sp = strg[vidx1 + 1][vidx2];
strg[vidx1][vidx2] = fp || sp;
}
else
strg[vidx1][vidx2] = false;
}
}
return strg[0][0];
}
}