//匹配算法
int Index_KMP(SString S,SString T,int next[]){
//初始化游标,i为匹配游标,j为模式游标
int i = 1,j = 1;
//以游标越界为条件循环
while(i <= S.length && j <= T.length){
//第一次循环时如果S.ch[1] == T.ch[1],则i=2,j=2,比较第二位.
//S.ch[1] != T.ch[1],则j = 0;跳转到第二次循环;由判断条件j == 0,i = 2,j = 1.
//In general,s1=t1,i=j=2;
///s1!=t1,i=2,j=1
if(j == 0 || S.ch[i] == T.ch[j]){
i++;
j++;
}
else
j = next[j];
}
if(j > L.length)
return i - T.length;
else
return 0;
}
void get_next(SString T,int next[]{
//初始化游标i,j
int i = 1,j = 0;
//初始化next数组(递归构造后续,给出a_1;
next[1] = 0;
//游标i的边界作为循环条件(不指向T的最后一个字符,为什么?)
while(i <= T.length){
//第一次循环时,j == 0进入第一个条件,j = 1,i = 2;next[2] = 1;
//第二次循环时,比较a_1与a_2;如果相等,j = 2,i = 3;next[3] = 2;
//如果一直触发条件1,相当于一直进行最大前缀和最大后缀的匹配next[]={,0,1,2,3,4,5,6,...,n}
//如果在某次触发条件2,j回退到next[j],由next[2] = 1;后续不再触发条件j == 0;仅做比较T.ch[i] == T.ch[j]
if(j == 0||T.ch[i] == T.ch[j]){
++i;++j;
next[i] = j;
}else
j = next[j];
}
}