问题
在文本text中查找模式pattern出现的所有位置(text长度为n,pattern长度为m,n>m)。
解法
对于text[0…n],从i=0,j=0开始,依次比较text[i+j]=pattern[j]。若相等则j向后移动一个位置再继续比较,直到j≥m,即text[i…i+m−1]=pattern[0…m−1],说明pattern在text的i下标出现;否则i=i+1,j=0重新开始新一轮匹配。
下面演示一个匹配的过程:
(1) 从text第0个字符开始匹配,有text[0…2]=pattern[0…2],text[3]=pattern[3],继续匹配下一个字符;
(2) 从text第1个字符开始匹配,有text[1]=pattern[0],继续匹配下一个字符;
(3) 从text第7个字符开始匹配,text[7…10]=pattern[0…3],匹配成功,算法结束;
显然对于text中的每个位置i,都需要进行一次匹配,而每次匹配的平均时间复杂度为pattern的长度m。该算法的时间复杂度为O(m×n)。
源码
SimpleMatch.h
SimpleMatch.cpp
测试
SimpleMatchTest.cpp