通配符匹配

通配符匹配

1.题目描述

请实现支持’?‘and’'的通配符模式匹配
‘?’ 可以匹配任何单个字符。
'
’ 可以匹配任何字符序列(包括空序列)。

输入:
	s = "adceb"
	p = "*a*b"
输出:
	true
解释:
	第一个'*'匹配空字符串,第二个'*'匹配"dce"

2. 解决思路

dp[i][j]表示字符串s的前i个字符和模式p的前j个字符是否匹配

  • 如果p[j]是小写字母,那么同时对应的s[i]也必须为小写字母并且相同。那么状态dp[i][j]dp[i-1][j-1]转移过来
  • 如果p[j]是问号,那么对于s[i]没有如何要求。那么状态dp[i][j]dp[i-1][j-1]转移过来
  • 如果p[j]是星号,那么对于s[i]更没有如何要求,且将分为两种情况:
    1. 使用这个星号,即这个星号至少匹配字符串s的一个字符,所以状态将从dp[i-1][j]转移过来
    2. 不使用这个星号,那么状态将从dp[i][j-]转移过来

故状态转移方程
d p [ i ] [ j ] = { d p [ i − 1 ] [ j − 1 ] s [ i ] 与 p [ j ] 相 同 或 者 p [ j ] = ? d p [ i − 1 ] [ j ] o r d p [ i ] [ j − 1 ] p [ j ] = ∗ f a l s e o t h e r dp[i][j]=\begin{cases} dp[i-1][j-1] & {s[i]与p[j]相同或者p[j]=? }\\ dp[i-1][j] or dp[i][j-1] & {p[j]=*} \\ false & {other} \end{cases} dp[i][j]=dp[i1][j1]dp[i1][j]ordp[i][j1]falses[i]p[j]p[j]=?p[j]=other

边界条件:

  • dp[0][0]=truesp全为空匹配成功
  • dp[i][0]=0,空模式无法匹配非空字符串
  • dp[0][j]p的前j个字符全为星号时,才为true

3. 案例分析—通配符匹配

class Solution:
    def isMatch(self , s: str, p: str) -> bool:
        # write code here
        m = len(s)
        n = len(p)
        
        dp = [[False] * (n+1) for _ in range(m+1)]
        dp[0][0] = 1
        for i in range(1, n+1):
            if p[i-1] == '*':
                dp[0][i] = True
            else:
                break
        
        for i in range(1, m+1):
            for j in range(1, n+1):
                if p[j-1] == '*':
                    dp[i][j] = dp[i][j-1] or dp[i-1][j]
                elif (p[j-1] == '?' or s[i-1] == p[j-1]):
                    dp[i][j] = dp[i-1][j-1]
        
        return dp[m][n]

你可能感兴趣的:(算法,算法,动态规划,python)