Wildcard Matching

Question

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial).

Example

isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false

Thoughts

这一题跟regular expression差不多,只是*的性质变了,不再跟之前的一个char有关

要改动的点

  • "*" 可以在第一个
  • 最后p[j-1] == "*"的状况

Solution

class Solution:
    """
    @param s: A string 
    @param p: A string includes "?" and "*"
    @return: A boolean
    """
    def isMatch(self, s, p):
        # write your code here
        # write your code here
        lenS = len(s)
        lenP = len(p)

        dp = [[False for j in range(lenP+1)] for i in range(lenS+1)]
        dp[0][0] = True

        for i in range(lenS + 1):
            for j in range(1, lenP + 1):
                if p[j-1] != "?" and p[j-1] != "*":
                    if dp[i-1][j-1] and s[i-1] == p[j-1]:
                        dp[i][j] = True
                elif p[j-1] == "?":
                    if dp[i-1][j-1]:
                        dp[i][j] = True
                else:
                    if dp[i-1][j]:
                        dp[i][j] = True
                    if dp[i][j-1]:
                        dp[i][j] = True

        return dp[lenS][lenP]