KMP算法实现

#include <stdio.h>// #include <string.h>
#include <assert.h>
#include<stdlib.h>
#define maxlen 255
typedef struct
{
    char ch[maxlen];
    int length;
}SString;
//求字符串长度
int strlen(char* p)
{
    assert(p != NULL);
    int count = 0;
    while (*p != '\0')
    {
        count++;
        p++;
    }
    return count;
}
//给t.ch初始值赋值
bool strassign(SString  &t, char * str)  
{  
    int len=strlen(str);

    if(len>maxlen)
        return false;
    for(int i=0;i<=len;i++){
            t.ch[i+1]=str[i];
    }
    t.length=len;
    return true;
}
//求next数组
void get_next(SString t,int next[]){
    next[0]=-1;
    next[1]=0;
    int i=1,j=0;
    while (i<=t.length)
    {
        if(j==0||t.ch[i]==t.ch[j]){
            next[++i]=++j;
            }
        else    
            j=next[j];
    }
}
//kmp
int Index_KMP(SString S,SString T,int next[]){
   int i=1,j=1;
   while(i<=S.length&&j<=T.length){
       if(j==0||S.ch[i]==T.ch[j]){
           ++i;
           ++j;               //继续比较后续字符
       }
       else{
           j=next[j];         //模式串右移
       }
  }
  if(j>T.length)
      return i-T.length;      //匹配成功
  else
      return 0;
}
int main(){
    SString s,t;
    char ch1[]="abcabaaabcd";
    char ch2[5]="abcd";
    strassign(s,ch1);
    strassign(t,ch2);
    int *next;
    next=(int*)malloc(sizeof(int)*(t.length+1));
    get_next(t,next);
    for (int i=0;i<=t.length;i++){
        printf("%d  ",next[i]);
    }
    int i=Index_KMP(s,t,next);
    if(i)
        printf("\n匹配成功!\n下标为%d",i);
    else
        printf("匹配失败!");
   
    return 0;
}
posted @ 2023-04-15 22:22  Dog17  阅读(21)  评论(0)    收藏  举报