Easy Java DP
  | \'\' | * | a | * |b\n:-: | :-: | :-: | :-: | :-: | :-:\n\'\' | T | T | F | F | F \na | F | T | T | T | F\nd | F | T | F | T | F\nc | F | T | F | T | F\ne | 
&nbsp; | \'\' | * | a | * |b\n:-: | :-: | :-: | :-: | :-: | :-:\n\'\' | T | T | F | F | F \na | F | T | T | T | F\nd | F | T | F | T | F\nc | F | T | F | T | F\ne | F | T | F | T | F\nb | F | T | F | T | T\n\n``` java\nclass Solution {\n    public boolean isMatch(String s, String p) {\n        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];\n        dp[0][0] = true;\n        for (int i = 0; i < p.length(); i++) {\n            if(p.charAt(i) == \'*\' && dp[0][i]){\n                dp[0][i+1] = true;\n            }\n        }\n        for (int i = 0; i < s.length(); i++) {\n            for (int j = 0; j < p.length(); j++) {\n                if(s.charAt(i) == p.charAt(j) || p.charAt(j) == \'?\'){\n                    dp[i+1][j+1] = dp[i][j];\n                }\n                if(p.charAt(j) == \'*\'){\n                    dp[i + 1][j + 1] = dp[i][j + 1] || dp[i + 1][j];\n                }\n            }\n        }\n        return dp[s.length()][p.length()];\n    }\n}\n```
[]