1、KSM模式匹配字符串图示
2、代码:
int next[MAXSIZE];//next数组,保存的内容是与T对应的,每一个对应的内容就是当T[j]!=S[i]时,j就回退到next[j],i不变。可以降低时间复杂度
void get_next(char *T,int next[])
{
int j,k;
j=0;k=-1;
next[0]=-1;
while(j<strlen(T)-1){
if(k==-1||T[j]==T[k]){
j++;k++;
next[j]=k;
}else{
k=next[k];
}
}
}
int Index_KMP(char *S,char *T,int pos)
{
int i=pos,j=0;
get_next(T,next);
for(j=0;j<20;j++){
}
j=0;
while(i<strlen(S)&&j<strlen(T)||j==-1){
if(j==-1||S[i]==T[j]){
i++;
j++;
}else{
j=next[j];
}
}
if(j>=strlen(T)){
return (i-strlen(T));
}else{
return -1;
}
}
//改进后的next算法
void get_next2(char *T,int next[])
{
int j,k;
j=0;k=-1;
next[0]=-1;
while(j<strlen(T)-1){
if(k==-1||T[j]==T[k]){
j++;k++;
if(T[j]!=T[k]){
next[j]=k;
}else{
next[j]=next[k];
}
}else{
k=next[k];
}
}
}
3、代码解析
如果在S字符串中匹配字符串T,则数组next中的每一个元素都和匹配字符串T的每一个元素相对应。
next中存的是:当在循环判断时,S[i]和T[j]不等时,j=next[j],i不变。next[j]代表的是在j这个地方出错时,重新遍历匹配字符串的起点。next[j]存的是返回的下标。