如需转载,请保留本文链接.
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算法分析.