kmp字符串匹配算法实现

/*
*功能:实现kmp字符串匹配算法
*时间:2011/8/1
*作者:milo
********/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_SIZE 1024
/*计算前缀函数pi[strlen(str_mode)]*/
/*pi[i]表示当0-i位置上的字符匹配,i+1位置上的字符不匹配时
  可能的最大后缀长度*/
static void compute_prefix_function(char *str_mode,int *pi)
{
    int m=strlen(str_mode);
    pi[0]=0;//第一个前缀值
    int k=0;//第一个前缀的长度
    int q;//当前要匹配的元素
    for(q=1;q<m;q++){//当前匹配到的字符位置
        while(k>0 && str_mode[k]!=str_mode[q])//利用动态规划思想调整下一个匹配位置
            k=pi[k-1];
        if(str_mode[k]==str_mode[q])
            k=k+1;
        pi[q]=k;
    }
}
static void kmp_matcher(char *str_text,char *str_mode)
{
    int n=strlen(str_text);
    int m=strlen(str_mode);
    int *pi=(int *)malloc(sizeof(int)*m);//存放匹配函数的数组
    compute_prefix_function(str_mode,pi);//计算匹配函数
    int q=0;//模式字符串的当前位置
    int i;//文本串的当前位置
    for(i=0;i<n;i++){
        while(q>0 && str_mode[q]!=str_text[i])
            q=pi[q-1];//调整模式串的位置
        if(str_mode[q]==str_text[i])
            q++;
        if(q==m){//成功匹配一处
            printf("%d ",i-m+1);
            q=pi[q-1];//调整模式串的位置
        }
    }
    free(pi);
}
int main()
{
    char str_text[MAX_SIZE+1];
    char str_mode[MAX_SIZE+1];
    fgets(str_text,MAX_SIZE,stdin);
    fgets(str_mode,MAX_SIZE,stdin);
    str_text[strlen(str_text)-1]=0;//fgets函数会读取换行符
    str_mode[strlen(str_mode)-1]=0;
    kmp_matcher(str_text,str_mode);
    printf("\n");
    return 0;
}

你可能感兴趣的:(算法,function,ini)