DP-LeetCode44. 通配符匹配(任意字符串包括空)

相似题:LeetCode10. 正则表达式匹配(零个或多个前面的那个元素)https://blog.csdn.net/IOT_victor/article/details/106929995

1、题目描述

'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。

https://leetcode-cn.com/problems/wildcard-matching/

2、代码详解

动画演示:https://leetcode-cn.com/problems/wildcard-matching/solution/dong-tai-gui-hua-dai-zhu-shi-by-tangweiqun/

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值