hdu3901 带通配符的匹配问题
2011-08-03 20:01 macaroniz 阅读(506) 评论(0) 收藏 举报这题真的非常考察对kmp算法的理解,特别记录一下。
题意很简单,给一个只包含字母的文本T和一个包含字母和通配符*与?的模式p,判断T中是否包含p。
解决带通配符的匹配问题有很多方法,比如编译原理中大家学过的DFN自动机,这里我们主要讨论使用KMP算法来解决这个问题。
不妨先讨论通配符*。
如何把通配符*加入到kmp的算法中呢?一个比较容易想到的方法是这样的:将模式p分成几个不包含*的子模式,并且分别在文本T中匹配,如果存在这么一个匹配结果,使得这些“一段段”的模式在文本中形成一些不相交的匹配,那么就意味着模式P是可以和文本T匹配的。
比如文本:abxxxcd,模式:ab*cd,这里模式被分成了两个子模式ab和cd,在文本中两个部分匹配的顺序和在模式中的顺序是一致的。
但是对于模式为cd*ab,子模式为cd和ab,在文本中的匹配顺序和模式中是不同的,说明无法匹配成功。
如果我们将模式进行分化之后分别匹配,然后再构造二分图判断,虽然可行,但是并不是一个最好的选择,实际上,我们可以证明:如果子模式序列p1,p2,p3...pn在文本T中有多个匹配结果,那么我们只需要按照他们匹配的结果,选择字典序最小的那个即可,换句话说,对于每个子模式,我们只需要贪心的选择第一个可行的匹配结果即可。
在讨论通配符?。
实际上由于?无论如何必须匹配一个字符,因此将?当做一般的字母处理即可,只不过在构造fail指针的过程中,我们认为?可以匹配任何字符。
浙公网安备 33010602011771号