Last updated 6 years ago
在文本texttexttext中查找模式patternpatternpattern出现的所有位置(texttexttext长度为nnn,patternpatternpattern长度为mmm,n>mn \gt mn>m)。
对于text[0…n]text[0 \dots n]text[0…n],从i=0,j=0i = 0, j = 0i=0,j=0开始,依次比较text[i+j]=pattern[j]text[i+j] = pattern[j]text[i+j]=pattern[j]。若相等则jjj向后移动一个位置再继续比较,直到j≥mj \ge mj≥m,即text[i…i+m−1]=pattern[0…m−1]text[i \dots i+m-1] = pattern[0 \dots m-1]text[i…i+m−1]=pattern[0…m−1],说明patternpatternpattern在texttexttext的iii下标出现;否则i=i+1,j=0i = i+1, j = 0i=i+1,j=0重新开始新一轮匹配。
下面演示一个匹配的过程:
(1)(1)(1) 从texttexttext第000个字符开始匹配,有text[0…2]=pattern[0…2],text[3]≠pattern[3]text[0 \dots 2] = pattern[0 \dots 2],text[3] \ne pattern[3]text[0…2]=pattern[0…2],text[3]=pattern[3],继续匹配下一个字符;
(2)(2)(2) 从texttexttext第111个字符开始匹配,有text[1]≠pattern[0]text[1] \ne pattern[0]text[1]=pattern[0],继续匹配下一个字符;
(3)(3)(3) 从texttexttext第777个字符开始匹配,text[7…10]=pattern[0…3]text[7 \dots 10] = pattern[0 \dots 3]text[7…10]=pattern[0…3],匹配成功,算法结束;
显然对于texttexttext中的每个位置iii,都需要进行一次匹配,而每次匹配的平均时间复杂度为patternpatternpattern的长度mmm。该算法的时间复杂度为O(m×n)O(m \times n)O(m×n)。