题意
给定一个字符串 ( s s s) 和一个字符模式 ( p p p) ,实现一个支持 ′ ? ′ '?' ′?′ 和 ′ ∗ ′ '*' ′∗′ 的通配符匹配。
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
如:
" ∗ a ∗ b " "*a*b" "∗a∗b"可以匹配 " a d c e b " "adceb" "adceb"(第一个 ∗ * ∗为空,第二个 ∗ * ∗为 d c e dce dce)
限制字母表为小写字母。
(另有LeetCode 10.正则表达式匹配与其相似,但更像正则表达式)
题解
因为这学期正好在学形式语言与自动机这门课,这道题显然是一个正则表达式的问题,就尝试模拟了一下正则表达式转 ϵ − N F A \epsilon-NFA ϵ−NFA。(虽然最后跑出来特别慢,但好处是直接按部就班走,不需要动脑子)
先构造出空串 ϵ \epsilon ϵ的 N F A : NFA: NFA:
对于每个输入字符,在原有的 N F A NFA NFA上进行修改,产生一个新的自动机。
考虑给定字符 a a a的三种情况:
( 1 ) (1) (1) a a a是小写字母。
构造新自动机的方法很简单:使原有的终结状态 F 0 F_0 F0