#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小时内删除。