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 ", ans); } int main() { Init(); Next(pat, len2); Kmp(des, len1, pat, len2); return 0; }