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