1.next[]數組概念:
/* 串的模式匹配 */
/* KMP匹配算法 */
/*
next[j]是指t[j]字符前有多少個字符與t開頭的字符相同
比如t="a b a b c" 考慮t[4]='c'
存在 t0t1=t2t3='ab' --->可知next[4]=2
*/
void GetNext(SqString t,int next[]){ //尋找加速匹配
int i,k;
j=0;k=-1;next[0]=-1;
while(j<t.length-1){
if(k==-1||t.data[j]==t.data[k]){
j++;k++;
next[j]=k;
}
else{
k=next[k];
}
}
}
//kmp
int KMP(SqString s,SqString t){
int next[MaxSize],i=0,j=0;
GetNext(t,next);
while(j<s.length&&j<t.length){
if(j==-1||s.data[i]==t.data[j]){
i++;
j++;// 沒有有用信息或兩個字符相等,繼續比較後面的字符
}
else{
j=next[j]; //i不變,j後退
}
}
if(j>=t.length){
return(i-t.length); //返回匹配模式串的首字符下標
}
else{
return(-1); //返回不匹配
}