Problem
Given an input string (s) and a pattern §, implement wildcard pattern matching with support for ‘?’ and ‘*’.
- ‘?’ Matches any single character.
- ‘*’ Matches any sequence of characters (including the empty sequence).
Algorithm
DP, Maximum common subsequence. When there is a ‘*’, the match can update to the end (if the prefix match successful).
Code
class Solution:
def isMatch(self, s: str, p: str) -> bool:
sLen = len(s)
pLen = len(p)
dp = [[0 for i in range(pLen+1)] for j in range(sLen+1)]
dp[0][0] = 1
for i in range(0, sLen+1):
for j in range(1, pLen+1):
if dp[i][j]:
continue # faster
if p[j-1] == '*' and (j == 1 or dp[i-1][j-1] or dp[i][j-1]):
for k in range(i, sLen+1):
dp[k][j] = 1
elif i and dp[i-1][j-1] and (p[j-1] == s[i-1] or p[j-1] == '?'):
dp[i][j] = 1
#print(dp)
return dp[sLen][pLen]