从图中我们可以看出来两个字符串的匹配在bc之间出现不同,如果用穷绝法的话
我们需要从头开始,无疑是增加了很多不必要的回退
这里我们讲一讲kmp算法
红色的数字就是j需要回退的位置,这个是如何计算得到的?
a为首元素固定为0,b为第二个元素固定为1,
从第三个位置的C看起
k为j的回退值,k-1=最大字串的长度(为什么后面讲)
此时分别正着和倒着取X个数,例如当x=1时,a和b不等,k-1=0。
x=2,ab和ba不等,k-1=0,k=1,所以c回退值为1
我们看一个更复杂的
x=1,a和b不同,k-1=0,k=1
x=2,ab和ab相等,k-1=2,k=3
x=3,abc和bab不等
x=4,abca和abab不等
x=5,abcab和cabab不等
x=6,abcaba和bacabab不等
因为不能取整个字符串,所以k的最大值是3,故c的回退值为3
解释为什么要k-1= max{X}
从蓝色框里可以看出来上下完全一样!!!
b的前面abca中的子串当X=1时才相等,这说明b前面一个a和abcac的a相等,那X=1,为什么要k-1=1,k=2?
因为X=1指向的是字串的最后一个字符a,这是已经相等的结果,所以我们需要比较相等字符串的下一个字符,所以X+1=k
int Index_KMP(SString S, SString T, int pos){ // 父串,子串,指定位置
i = pos, j = 1;
while (i < S.length && j < T.length){
if (j == 0 || S.ch[i] == T.ch[j]){
i++;
j++;
}
else
j = next[i]; //i不变,j后退
}
if (j > T.lenght) return i - T.lenght; // 匹配成功
else return 0;
}