KMP字符串匹配算法

来源:互联网 发布:淘宝客户管理软件 编辑:程序博客网 时间:2024/06/05 04:18
#include<stdio.h>/* P为模式串,下标从0开始 */void GetNext(char *P, int p_len, int next[]){    int i = 0;   //P的下标    int j = -1;      next[0] = -1;    while (i < p_len)    {        if (j == -1 || P[i] == P[j])        {            i++;            j++;            if (P[i] != P[j])      //和上面的判断,i值已经发生变化(关键)                next[i] = j;            else                next[i] = next[j];  //既然相同就继续往前找前缀        }        else            j = next[j];    }}/* 在S中找到P第一次出现的位置 */////   S;长字符串//   P:短字符串/*******************************/int KMP(char *S, char  *P){int next[30] = { 0 };    int i = 0;  //S的下标    int j = 0;  //P的下标    int s_len = strlen(S);    int p_len = strlen(P);    GetNext(P,p_len ,next);    while (i < s_len && j < p_len)    {        if (j == -1 || S[i] == P[j])  //P的第一个字符不匹配或S[i] == P[j]        {            i++;            j++;        }        else            j = next[j];  //当前字符匹配失败,进行跳转    }    if (j == p_len)  //匹配成功        return 1;//i - j;        return 0;  //-1}int main(){    if(KMP("5252525112312323543453", "12312323"))printf("kmp is ok\n");else    printf("kmp is fail\n");    return 0;}


转载:http://www.61mon.com/index.php/archives/183/

原创粉丝点击