|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_next(char * T, int * next)
{
int j = -1;
int i = 0;
next[0] = -1; //-1表示j无路可退
while(i < strlen(T))
{
if(-1 == j || T[i] == T[j]) //T[i]表示后缀单个字符,T[j]表示前缀单个字符
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j]; //若字符串不同,则j值后退
}
}
}
//返回子串T在主串S第pos个字符之后的位置,若不存在,则返回0
int Index_KMP(char * S, char * T, int pos)
{
int i = pos; //i为主串S当前位置下标
int j = 0; //j为子串T当前位置下标
int next[255];
get_next(T, next); //得到T的next数组
while((i <= strlen(S)) && (j <= strlen(T)))
{
if(-1 == j || S[i] == T[j]) //两字符相等则继续比较
{
i++;
j++;
}
else //若不相等,则i不后退,j后退到合适的位置
{
j = next[j];
}
}
if(j == strlen(T))
{
return (i-strlen(T));
}
else
{
return -1;
}
}
int main(void)
{
int index;
int pos = 0;
char *s = "ababcabcacbab";
char *t = "abcac";
index = Index_KMP(s, t, pos);
if(-1 == index)
printf("查找失败!");
else
printf("目标位于%d\n", index);
return 0;
} |
|