题解 | 字符串通配符

字符串通配符

https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

import sys

lines = sys.stdin.readlines()
# 同字母不区分大小写
s = lines[0].strip().lower()
p = lines[1].strip().lower()

def match(s,p):
    m,n = len(s),len(p)
    # 初始化二维矩阵
    dp = [[False for _ in range(1+n)] for _ in range(1+m)]
    # 边界值1
    dp[0][0] = True
    # 边界值2
    for i in range(1,m+1):
        if s[i-1] == '*':
            dp[i][0] = dp[i-1][0]

    # 所有的对ij的遍历都应从1开始取到mn,代表的是字符的个数而不是索引
    for i in range(1,1+m):
        for j in range(1,1+n):
			# 三种配对的情况,分别是s第i个字符是:'*','?',其他
            if s[i-1] == '*':
                if p[j-1].isalnum():
                    dp[i][j] = dp[i][j-1] or dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
            elif s[i-1] == '?' and p[j-1].isalnum():
                dp[i][j] = dp[i-1][j-1]
            elif s[i-1] == p[j-1]:
                dp[i][j] = dp[i-1][j-1]
    return dp[m][n]

if match(s,p):
    print('true')
else:
    print('false')                

二刷错误:

1.索引混用:p用了s的索引(最严重的错误)

2.设置边界值的顺序反了,应该先设置初始的dp[0][0]

3.i,j含不够明确,永远是s的前i个字符和p的前j个字符,第i,j个字符对应的索引要-1

4.忽略了同字母不区分大小写的情况

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务