模式匹配

来源:互联网 发布:网络摄像机软件下载 编辑:程序博客网 时间:2024/06/08 08:39

描述:
求一个字符串在另一个字符串中的位置,称为模式匹配,如果匹配成功,则输出第一次匹配成功的位置,否则输出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;}


原创粉丝点击