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", "?*"))

 

你可能感兴趣的:(算法LeetCode)