字符串匹配的顺序既能从头到尾,也能从尾到头。从尾到头的叫做朴素逆向匹配算法。可以参考一下这篇文章
但是单纯的正向或是逆向朴素匹配并没有改变算法执行的时间。都是O(m*n)
显然如果只是朴素逆向匹配并没有实际意义,所以Horspool提出了出现启发式规则。所谓的出现启发式规则是:
在不匹配发生之后,将T[s + m–1]对齐到模式 P[0..m–2]中的最右匹配的位置, 如果没有匹配的字符,将P向右移动m个位置。
通俗来说就是,如果模式串与主串不匹配,则在模式串除了最后一个字符的剩余字符串中,从后往前找到与模式串最后一个字符对应的主串字符相同的字符,并将这两个字符对齐。
如:
T | d | a | d | a | t | a |
P | d | a | t | a | ||
P | d | a | t | a |
在第一次匹配中,主串T与模式串P发生了不匹配,此时模式串的最后一个字符为P[3]对应的主串字符为T[3],故在模式串除最后一个字符外的剩余字符串P[0-2]中从后往前找到与T[3]相同的字符,为P[1]。将P[1]与T[3]对齐,可以发现匹配成功了。
但是如果没有找到相同的字符呢?
如:
T | d | a | d | e | d | a | t | a |
P | d | a | t | a | ||||
P | d | a | t | a |
可以看出此时P[0-2]中并没有与T[3]相同的字符。此时就将模式串整个向右移动m个位置,m为模式串的长度。
再来一道题练习一下