【算法】

 

leetcode上的通配符匹配算法题,里面的一个潜规则证明,否则,算法必须使用stack进行回溯

 

44. 通配符匹配

给定一个字符串 (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位置进行匹配,没有这个必要

 

posted @ 2020-04-30 16:50  wind_land  阅读(146)  评论(0)    收藏  举报