题解 | 字符串通配符
字符串通配符
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.忽略了同字母不区分大小写的情况

查看29道真题和解析