O(mn) time O(mn) space DP Solution Python with explanation
I probably could have combined some clauses, but it works.  The idea is that we need to go through all of the characters in the string, and the pattern and end 
I probably could have combined some clauses, but it works.  The idea is that we need to go through all of the characters in the string, and the pattern and end up with true path at the end for it to return true.\nThis means the current cell is true in the following cases:\n1.  the current cell\'s letters  i-1th letter from the string and j-1th letter from the string match and the dp[i-1][j-1] is true which means the previous two letter\'s compared was true.\n2.  if the current i-1th letter is * then we let all of the cases pass and the future cases pass so if dp[i-1][j] or dp[i][j-1] is true we mark dp[i][j] as true, this means all values ahead of this column will be marked as true\n3.  if the current i-1th letter is ? then we just copy dp[i-1][j-1] (if the last letter matched was true)\nThe branches are just to make sure we don\'t have an out of range error since there\'s a variety cases of i-1 and j-1s that can be less than 0 or that cases that we don\'t have enough characters to get the i-1th or j-1th character, and probably can be cleaned up.\nVisual Example:\n```\ns="adceb"\np="*a*b"\n     0       a       d    c         e     b\n0  [true,  false,  false, false,  false, false]\n*  [true,  true,   true,  true,   true,  true ]\na  [false, true,   false, false,  false, false]\n*  [false, true,   true,  true,   true,  true ]\nb  [false,  false, false, false,  false, true ]\n\n```\n```\nclass Solution(object):\n    def isMatch(self, s, p):\n        N1 = len(p)\n        N2 = len(s)\n        dp = [[False for j in range(N2+1)] for i in range(N1+1)]\n        for i in range(N1+1):\n            for j in range(N2+1):\n                if(i==0 and j==0):\n                    dp[i][j]=True\n                elif(j==0):\n                    dp[i][j]= (N1>0 and i>0 and p[i-1]==\'*\' and (dp[i-1][j]));\n                elif(i==0):\n                    dp[i][j]= (N1>0 and i>0 and p[i-1]==\'*\' and (dp[i][j-1]));\n                else:\n                    dp[i][j]=((dp[i-1][j-1] and (N1>0 and N2>0 and p[i-1]==s[j-1]))or\n                              (N1>0 and p[i-1]==\'*\' and (dp[i-1][j] or dp[i][j-1])) or \n                              (N1>0 and p[i-1]==\'?\' and dp[i-1][j-1]))\n        return dp[N1][N2]\n```
[]