算法的核心有以下两点:
1. 移动位数= 已匹配的字符数- 对应部分匹配值
2. 部分匹配表的计算
以在StringstrSrc = ”ababcabcacbab”中寻找子串String strSub = ”abcac”为例进行说明
根据计算可知abcac的部分匹配表为:(部分匹配表的计算过程将在最后给出)
a |
b |
c |
a |
c |
0 |
0 |
0 |
1 |
0 |
第一次匹配如下:
strSrc: a b a b c a b c a c b a b
strSub: a b c
在红字处不匹配,此时已匹配字符为”ab”,已匹配字符数为2。
对应部分匹配值可根据部分匹配表查到对应的值。在第一次匹配中c匹配失败,其之前一个元素b对应的匹配值为0。
根据公式有:移动位数 = 2 – 0 = 2;strSub右移两步进行第二次比较:
第二次匹配如下:
strSrc: a b a b c a b c a c b a b
strSub: a b c a c
在红字处不匹配,此时已匹配字符为”abca”,已匹配字符数为4。
对应部分匹配值可根据部分匹配表查到对应的值。在第一次匹配中c匹配失败,其之前一个元素a对应的匹配值为1。
根据公式有:移动位数 = 4 – 1 = 3;strSub右移三步进行第三次比较:
第三次匹配如下:
strSrc: a b a b c a b c a c b a b
strSub: a b c a c
匹配完成
部分匹配表计算过程:
1. 先要了解前缀和后缀两个概念:"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。
2. 部分匹配表中各元素的部分匹配值即为前缀和后缀的最长的共有元素的长度。
以abcac为例:
-a的前后缀均为空集,无共有元素,共有元素长度为0
-ab的前缀为[a],后缀为[b],无共有元素,共有元素长度为0
-abc的前缀为[a,ab],后缀为[c,bc],无共有元素,共有元素长度为0
-abca的前缀为[a,ab,abc],后缀为[bca,ca,a],有共有元素a,共有元素长度为1
-abcac的前缀为[a,ab,abc,abca],后缀为[bcac,cac,ac,c],无共有元素,共有元素长度为0
因此有部分匹配表:
a |
b |
c |
a |
c |
0 |
0 |
0 |
1 |
0 |
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/miaoyunzexiaobao/article/details/48028973