字符串匹配

KMP

 

#include <stdio.h>
#include <string.h>
#define N 102

int len1, len2;
char des[N], pat[N];
int next[N], ans;

void Init()
{
    scanf("%d%d", &len1, &len2);
    getchar();
    for(int i=0; i<len1; i++)
        scanf("%c", &des[i]);
    getchar();
    for(int j=0; j<len2; j++)
        scanf("%c", &pat[j]);
}
/*
    对Next函数处理过程的理解参看图示
*/
void Next(char str[], int len)
{
    memset(next, -1, sizeof(next));
    for(int j=1; j<len; j++)
    {
        int i = next[j-1];
        while(str[j]!=str[i+1] && i>=0)
        {
            i = next[i];
        }
        if(str[j] == str[i+1])
            next[j] = i+1;
        else
            next[j] = -1;
    }
}
/*
    目标串des长度为len1,对应s下标
    模式串pat长度为len2,对应p下标
*/
void Kmp(char des[], int len1, char pat[], int len2)
{
    int s = 0, p = 0;
    while(s<len1 && p<len2)
    {
        if(des[s] == pat[p])
        {
            s++;
            p++;
        }
        else
        {
            if(p == 0)
                s++;                // pat第一个字符就匹配失败,则从des下一个开始
            else
                p = next[p-1] + 1;  // pat下标p根据next快速回退到指定位置
        }
    }
    if(p < len2)                    // 整体匹配失败
        ans = -1;
    else ans = s-len2;              // 整体匹配成功          
    printf("ans = %d\n", ans);
}
int main()
{
    Init();
    Next(pat, len2);
    Kmp(des, len1, pat, len2);
    return 0;
}

 

posted on 2015-07-13 14:39  huashunli  阅读(128)  评论(0编辑  收藏  举报

导航