SimpleMatch 简单匹配

问题

在文本texttext中查找模式patternpattern出现的所有位置(texttext长度为nnpatternpattern长度为mmn>mn \gt m)。

解法

对于text[0n]text[0 \dots n],从i=0,j=0i = 0, j = 0开始,依次比较text[i+j]=pattern[j]text[i+j] = pattern[j]。若相等则jj向后移动一个位置再继续比较,直到jmj \ge m,即text[ii+m1]=pattern[0m1]text[i \dots i+m-1] = pattern[0 \dots m-1],说明patternpatterntexttextii下标出现;否则i=i+1,j=0i = i+1, j = 0重新开始新一轮匹配。

下面演示一个匹配的过程:

(1)(1)texttext00个字符开始匹配,有text[02]=pattern[02]text[3]pattern[3]text[0 \dots 2] = pattern[0 \dots 2],text[3] \ne pattern[3],继续匹配下一个字符;

(2)(2)texttext11个字符开始匹配,有text[1]pattern[0]text[1] \ne pattern[0],继续匹配下一个字符;

\cdots

(3)(3)texttext77个字符开始匹配,text[710]=pattern[03]text[7 \dots 10] = pattern[0 \dots 3],匹配成功,算法结束;

显然对于texttext中的每个位置ii,都需要进行一次匹配,而每次匹配的平均时间复杂度为patternpattern的长度mm。该算法的时间复杂度为O(m×n)O(m \times n)

源码

SimpleMatch.h

SimpleMatch.cpp

测试

SimpleMatchTest.cpp

Last updated