精读《算法题 - 通配符匹配》

文章详细解析了LeetCode中一个Hard难度的题目——通配符匹配,讨论了使用模拟匹配和动态规划两种方法。动态规划是解决此问题的关键,尤其是理解*号在匹配过程中的三种可能性,并构建正确的状态转移方程。难点在于从左到右匹配的思维定势以及*号匹配的双向等价性。文章提供了动态规划的解决方案,并指出还有优化空间,如使用滚动数组和提前终止循环。
摘要由CSDN通过智能技术生成

今天我们看一道 leetcode hard 难度题目:通配符匹配。

题目

给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?''*' 匹配规则的通配符匹配:

  • '?' 可以匹配任何单个字符。

  • '*' 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

思考

最直观的思考是模拟匹配过程,以 s = "abc", p = "abd" 为例,匹配过程是这样的:

  1. "a" 匹配 "a",通过

  2. "b" 匹配 "b",通过

  3. "c" 不匹配 "d",失败

只要匹配过程有任何一个字符匹配失败,则整体匹配失败。如果没有 '?''*' 号,题目则异常简单,只要一个指针按顺序扫描,扫描过程每个字符必须相等,且同时结束才算成功,否则判断失败。

加上 '?' 依然很简单,因为 '?' 号一定会消耗掉,只是它可以匹配任何字符,所以还是一个指针扫描,遇到 p'?' 号时,跳过判等继续向后扫描即可。

加上 '*' 号时该题成为 hard 的第一个原因。由于 '*' 可以匹配空字符,也可以匹配任意多个字符,所以遇到 p'*' 时有三种处理可能性:

  1. 当做没见过 '*',直接判等,不消耗 s,并匹配 p 的下一个字符。此时对应 'p' 不匹配任何字符。

  2. 直接消耗掉 '*' 判等,同时消耗 sp。此时 '*''?' 的作用等价。

  3. 不消耗 '*',但是消耗 s。此时对应 '*' 匹配多个字符而可以不消耗自己的特性。

很容易想到写一个递归的实现,代码如下:

function isMatch(s: string, p: string): 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值