相似题:LeetCode10. 正则表达式匹配(零个或多个前面的那个元素)https://blog.csdn.net/IOT_victor/article/details/106929995
1、题目描述
'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。
https://leetcode-cn.com/problems/wildcard-matching/
2、代码详解
class Solution(object):
def isMatch(self, s, p):
"""
'?' 可以匹配任何单个字符
'*' 可以匹配任意字符串(包括空字符串)
"""
# 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 (true 的话表示匹配)
m = len(s) # 行,串s
n = len(p) # 列,模式p
if m == 0 and p.count('*') == n:
return True
dp = [[False] * (n + 1) for _ in range(m + 1)]
dp[0][0] = True
# 第0行:s 为空,与 p 匹配,所以只要 p 开始为 * 才为 true
for i in range(1, n+1): # 1~n
dp[0][i] = dp[0][i-1] and p[i-1] == '*'
# 第0列,p为空,全为False
for i in range(1, m+1):
for j in range(1, n+1):
# 当 s[i] == p[j],或者 p[j] == ?
if s[i-1] == p[j-1] or p[j-1] == '?':
dp[i][j] = dp[i-1][j-1]
elif p[j-1] == '*':
dp[i][j] = dp[i][j-1] or dp[i-1][j]
# dp[i][j - 1] 表示 * 代表的是空字符,例如 ab, ab*
# dp[i - 1][j] 表示 * 代表的是非空字符,例如 abcd, ab*
return dp[m][n]
S = Solution()
s = "adceb"
p = "*a*b"
print(S.isMatch(s, p)) # true