#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 40
typedef int Status;
typedef char String[MAXSIZE+1];
typedef char *SString;
Status StrAssign(String T,char *chars);
void get_next(SString T, int *next);
int Index_KMP(SString S, SString T, int pos);
int main(void){
int pos=1;
SString T,S;
T=(char *)malloc(40);
S=(char *)malloc(40);
char *chars;
chars="ababcabcacbab";
StrAssign( S,chars);
chars="abcac";
StrAssign( T,chars);
printf("%d",Index_KMP( S, T, pos));
getchar();
return 0;
}
Status StrAssign(String T,char *chars)
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
void get_next(SString T, int *next) { // 算?法¤¡§4.7
int i=1;
next[1]=0;
int查符合两个条件之一的字符串函数 j=0;
while (i<T[0]) {
if(j==0 || T[i]== T[j]) {
++i; ++j; next[i] = j;
} else j= next[j];
}
}
int Index_KMP(SString S, SString T, int pos) { // 算?法¤¡§4.6
// 利¤?用®?模¡ê式º?串ä?T的Ì?next函¡¥数ºy求¨®T在¨²主¡Â串ä?S中D第̨²pos个?字Á?符¤?之?后¨®的Ì?位?置?的Ì?
// KMP算?法¤¡§。¡ê其?中D,ê?T非¤?空?,ê?1≤¨¹pos≤¨¹StrLength(S)。¡ê
int next[255];
int i = pos;
int j = 1;
get_next(T, next);
while (i <= S[0] && j <= T[0]) {
if (j == 0 || S[i] == T[j]) { // 继¨¬续?比À¨¨较?后¨®继¨¬字Á?符¤?
++i; ++j;
} else j = next[j]; // 模¡ê式º?串ä?向¨°右®¨°移°?动¡¥
}
if (j > T[0]) return i-T[0]; // 匹£¤配?成¨¦功|
else return 0;
} // Index_KMP
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论