44. 通配符匹配
题目描述
这个题目和之前做的「10. 正则表达式匹配」比较类似,不同的是和?没有关联关系,只用考虑匹配0-多次就行
f1-折半枚举+排序+二分 |
基本分析
只需要考虑不同的地方,对于*取0到多次的时候,怎么用公式替代枚举?这里还是列出f[i][j]的情况,再用i-1替代i,得到f[i-1][j]的情况,结合两个式子,得到转移方程
代码
class Solution: def isMatch(self, s: str, p: str) -> bool: n, m = len(s), len(p) s = ' ' + s p = ' ' + p f = [[False] * (m+1) for _ in range(n+1)] f[0][0] = True for i in range(n+1): for j in range(1, m+1): if i-1 >=0 and (p[j]==s[i] or p[j] == '?'): f[i][j] = f[i-1][j-1] elif p[j] == '*': f[i][j] = f[i][j-1] or (i-1>=0 and f[i-1][j]) return f[n][m]
复杂度
时间:
空间:
总结
p[j]=*时候,转移方程这块,还是参考10的思路,总的来说更简单一点f[i][j] = f[i][j-1] or f[i-1][j]
需要注意的是上面的边界条件,前一个式子不需要i-1>=0, 而后面需要,所以对i的限制只写到后面
其他需要注意的和t10的情况类似。
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现