模式匹配基本概念
在一个较长的n个字符串(称为文本)中,寻找一个给定的m个字符的串(称为模式)。
蛮力算法:简单地从左到右比较模式和文本中每一对相应的字符,如果一旦不匹配,把模式向右移一格,再进行下一轮尝试.(详见《算法设计与分析基础》p80)
Horspool算法:在蛮力法模式匹配算法中,如果遇到了一对不匹配字符,我们需要把模式右移。如果不存在错过文本中一个匹配子串的风险,我们希望移动的幅度尽可能地大。假设文本中对齐模式最后一个字符的元素是字符c,Horspool算法根据c的不同情况来确定移动的距离。Horspool算法是Boyer-Moore算法的简化版本(详见《算法设计与分析基础》p195)
Boyer-Moore算法:蛮力法模式匹配算法中最快的一个,传说中notepad中查找用的就是BM算法。《算法设计计与分析基础》( p197)讲的非常易懂,直接看一遍可以秒过!
KMP算法:BM用的是坏符号移动和好后缀移动,匹配是从右到左,而KMP用的是前缀函数移动,匹配是从左到右。KMP尽管没有BM快,但重要的是算法思想,其前缀函数移动正是多模式匹配的AC自动机算法的基础。学习过程:先看《算法导论》( p560),然后可以看Matrix67的《KMP算法详解》,大牛用另外一种思路来解释KMP算法,但实质和算导是一样的,看看代码就知道了,最后看阮一峰的《字符串匹配的KMP算法》,文章用图示化的方法细述了KMP算法,一目了然。
KMP
基本概念:
KMP是模式匹配算法中最重要的一种,预备知识要了解模式匹配基本概念、蛮力算法(详见《算法设计与分析基础》p80)、Horspool算法(详见《算法设计与分析基础》p195)和Boyer-Moore算法(详见《算法设计与分析基础》p197)
Boyer-Moore算法学习 http://blog.youkuaiyun.com/sealyao/article/details/4568167
Matrix67 《KMP算法详解》 http://www.matrix67.com/blog/archives/115
应用拓展:
习题:
【bzoj1009】[HNOI2008]GT考试
【wikioi1204】寻找子串位置(KMP)
【cf471D】MUH and Cube Walls