Leetcode: 44. Wildcard Matching

Problem Statement

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        s += "$"
        p += "$"
        N = len(s)
        M = len(p)

        dp = [[False] * (M + 1) for _ in range(N + 1)]
        for i in range(N, -1, -1):
            for j in range(M, -1, -1):
                if i == N and j == M:
                    dp[i][j] = True
                elif i == N or j == M:
                    dp[i][j] = False
                elif p[j] == "?":
                    dp[i][j] = dp[i + 1][j + 1]
                elif s[i] == p[j]:
                    dp[i][j] = dp[i + 1][j + 1]
                elif p[j] == "*":
                    dp[i][j] = dp[i][j + 1] or dp[i + 1][j] or dp[i + 1][j + 1]
                else:
                    dp[i][j] = False

        return dp[0][0]


assert Solution().isMatch("aa", "a") == False
assert Solution().isMatch("aa", "*") == True
assert Solution().isMatch("cb", "?a") == False