KMP算法学习记录----Jake Boxer博文学习部分

如需转载,请保留本文链接.

Jake Boxer 英文博文链接:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

如何使用部分匹配表

1.作用:使用部分匹配表跳过那些已经做过的,旧的比较部分,从非重复匹配部分开始.

2.if(匹配表结果大于1)

 {

  允许跳过的字符数量 = 匹配长度 - 部分匹配表[匹配长度-1];

    }

    else

 {

  允许跳过的字符数量 =  部分匹配表[匹配长度-1];

 }

举例说明:

使用"abababca"作为子串,匹配"bacbababaabcbab"母串.

部分匹配表如下:

字符串a|b|a|b|a|b|c|a

索引值0|1|2|3|4|5|6|7

匹配值0|0|1|2|3|4|0|1

第一次匹配

bacbababaabcbab

abababca

结果:无匹配结果

第二次匹配

bacbababaabcbab

  abababca

结果:匹配数量为:1

允许跳过的字符数量 =  部分匹配表[1-1]  = 0;

第五次匹配

bacb|ababa|abcbab

        |ababa|bca

结果:匹配数量为:5

允许跳过的字符数量 = 5 - 部分匹配表[5-1] = 5 - 3 = 2;

第六次匹配

bacbab|aba|abcbab

        xx|aba|babca

跳过两个字符后,匹配结果如上,本次匹配结果为:3

允许跳过的字符数量 = 3 -部分匹配表[3-1] = 3 - 1 = 2;

第七次匹配

bacbabab|a|abcbab

            xx|a|bababca

跳过两个字符后,匹配结果如上,本次匹配结果为:1

此时子串的尾字符,已经超出了主串的长度,因此,主串与子串无匹配结果.

下一篇文章为《大话数据结构》KMP算法分析.

原文地址:https://www.cnblogs.com/yikecaidechengzhangshi/p/8573598.html