python算法-1字符串-9 Leetcode 044Wildcard_Matching

python算法-1字符串-9 Leetcode 044Wildcard

 

在线运行:https://pyleetcode.gitee.io/codes_html/Leetcode_044_4Wildcard_Matching.html

 

def isMatch2( s, p):
    s = '0' + s
    p = '0' + p
    # dp[i][j]表示:s的前i个字符与p的前j个字符是否匹配
    dp = [[False for _ in range(len(p))] for _ in range(len(s))]

    # 初始化
    dp[0][0] = True  # 空字符串与空字符串相匹配
    for i in range(1, len(p)):
        if p[i] == '*':
            # 取决于前面是否匹配
            dp[0][i] = dp[0][i - 1]

    # 动态规划
    for i in range(1, len(s)):
        for j in range(1, len(p)):
            if s[i] == p[j] or p[j] == '?':
                dp[i][j] = dp[i - 1][j - 1]
            elif p[j] == '*':
                dp[i][j] = dp[i - 1][j] or dp[i][j - 1]
    return dp[-1][-1]


def isMatch(s, p):
    i = 0
    j = 0
    # s串中0:iStart部分的字符串(在jStar位置星号的万能匹配下)与p中0:jStar部分完全匹配
    iStar = -1
    jStar = -1
    m = len(s)
    n = len(p)
    while i < m:
        # 好说,正常过
        if j < n and (s[i] == p[j] or p[j] == '?'):
            j += 1
            i += 1
        elif j < n and p[j] == '*':
            # *出现位置用jStar记住
            jStar = j
            # s串中0:iStart部分的字符串(在jStar位置星号的万能匹配下)与p中0:jStar部分完全匹配
            iStar = i
            # i不+1,因为*号也可以选择不匹配,也就是,遇到*号,你可以忽略。(axaaxabcdbc, ax*bc 。拿出第i=2,j=2,位置进行比较,s[i]=a,p[j]=*,
            # a和*不一样,*虽然可以万能匹配,让你i继续过,但是也可以不匹配,让*的后一个老哥p[j+1]=‘b’ 来和你匹配)
			# 反正,当*后面那个老哥不能出面消你的时候,*可以再出面做万能消除!所以不用+1
            j += 1
        elif iStar >= 0:
            # s中继续往后走,因为*万能匹中s中字符,需要这一步*来出面消除,则意味着把s中iStar前面的全部用p中jStar位的*来消除
            iStar += 1
            i = iStar
            # 如果到了需要*来万能解决出面的时候,j从新回到前面的*后一位
            j = jStar + 1
        else:
            # 这里,意味着?没有'*',不想等或每个'?'取匹中s中的i位字符
            return False

    while j < n and p[j] == '*':
        j += 1
    return j == n


'''
虽然*能匹配任意串,但是p中*后面出现字符不在s中,就断了
'''

print(isMatch("axaaxabcdbc", "ax*bc"))
print(isMatch("aa", "a*"))
print(isMatch("ab", "?*"))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值