【算法】
leetcode上的通配符匹配算法题,里面的一个潜规则证明,否则,算法必须使用stack进行回溯
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/wildcard-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这里的回溯算法,进行线性的匹配和扫描
举个例子
abc zz def mm aqq cc ef
a*z*m*ef
其实pattern string可以简化成
*K1*K2*K3* 。。。 *Kn*
k1,k2...,kn 是一个token,即把两个**之间的string简化成一个token
这里有一个潜规则,能避免使用stack的潜规则
假设现在有一个k1 * k2 * k3的pattern
test string里面匹配到一个K1,后面有两个K2,即 aaaa k1 bbbcc k2 dddd k2 ffffgggggk3
在匹配pattern时,匹配到第一个k2即可,虽然有2个k2,但是第二个k2不用进行匹配
因为,第一个k2之后的串 标记为substr1,第二个k2之后的为substr2
如果substr2的串,匹配了 *k3 模式, 则 substr1一定能匹配到,逆否命题也会成立,即如果substr1匹配不到 *k3 模式,则substr2也不会匹配到
所以用 非贪婪匹配, 进行顺序扫描, 能完成匹配
不用 把两个 k2的位置加入到stack中,当从第一个k2位置开始匹配k3,匹配不到时,再拿出第二个k2位置进行匹配,没有这个必要

浙公网安备 33010602011771号