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