模式匹配

描述:
求一个字符串在另一个字符串中的位置,称为模式匹配,如果匹配成功,则输出第一次匹配成功的位置,否则输出0。KMP算法是一种高效的模式匹配算法。要求采用KMP算法完成该题目。
输入:
输入包今含若干个测试用例,每个测试用例占两行,其中第一行为目标字符串,第二行为模式串。
输出:
对每个测试用例,用两行输出,其中第一行输出该用例的模式串的各字符的next值,第二行输出模式串在目标串中第一次匹配成功的位置。如果匹配不成功,则输出0。
样例输入:
abcdefg
bcd
0000001
0001
110011001100
111
dabcabcabc
abc
样例输出:
0 1 1
2
0 1 2 3
4
0 1 2
0
0 1 1
2


代码如下:

#include <stdio.h>
#include <string.h>
void get_next(char *str,int len,int *next)
{
    next[0] = 0;
    next[1] = 1;
    int k = 0;
    for(int i=2; i<len; i++)
    {
        k = next[i-1];
        while(k>1 && str[i-1]!=str[k-1])
            k = next[k];
        if(str[i-1] == str[k-1])
            next[i] = k+1;
        else
            next[i] = 1;
    }
}
void print_next(int *next,int len)
{
    for(int i=0; i<len; i++)
        printf("%d ",next[i]);
    printf("\n");
}
int KMP(char *str,int slen,char *vision,int len,int *next)
{
    int j = 0;
    for(int i=0; i<slen; i++)
    {
        while(j>0 && str[i] != vision[j])
            j = next[j]-1;
        if(str[i] == vision[j])
            j++;
        if(j==len)
            return i-len+1;
    }
    return -1;
}
int main()
{
    char str[100],vision[100];
    int slen,len,next[100];
    while(scanf("%s%s",&str,&vision)!=EOF)
    {
        len = strlen(vision);
        slen = strlen(str);
        get_next(vision,len,next);
        print_next(next,len);
        printf("%d\n",1+KMP(str,slen,vision,len,next));
    }
    return 0;
}


posted @ 2017-12-10 17:42  让你一生残梦  阅读(227)  评论(0编辑  收藏  举报