这个算法看了。很久啊。很难懂。。虽说现在会了。。不过。应用的根本不熟练
老规矩。。。贴下代码。。纪念下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char *ch;
int length;
}SString;
int strKMP(SString *S,SString *T,int pos,int next[]); //求在主窜中S中第pos个字符之后的位置的KMP算法
void get_next(SString *T,int next[]); //求模式串中T的next函数值并存入数组next
int StrAssign(SString *str,char *chars); ///生成一个与chars相等的字符串
int main()
{
SString S={NULL,0},T={NULL,0};
int pos;
int next[50];
StrAssign(&S,"ababcabcacbab");
StrAssign(&T,"cacba");
get_next(&T,next);
pos=strKMP(&S,&T,0,next);
printf("%d\n",pos);
return 0;
}
int StrAssign(SString *str,char *chars)
{
if(str->ch) //清空str
free(str->ch);
str->ch = (char *)malloc((strlen(chars)+1)*sizeof(char));
if( !str->ch )
return 0;
str->length = strlen(chars);
strcpy(str->ch,chars); //复制字符串
return str->length;
}
int strKMP(SString *S,SString *T,int pos,int next[])
{
int i=pos,j=0;
while(i < S->length && j < T->length)
{
if(j==-1 || S->ch[i] == T->ch[j])
{
i++;
j++;
}
else
j = next[j];
}
if(j >= T->length)
return i - (T->length);
else
return -1;
}
void get_next(SString *T,int next[])
{
int i=0,j=-1;
next[0]=-1;
while(i < T->length-1) //这里注意下
{
if(j==-1 || T->ch[i] == T->ch[j])
{
i++; j++;
if(T->ch[i] != T->ch[j])
next[i]=j;
else
next[i] = next[j];
}
else
j = next[j];
}
}