#include <stdio.h> #include <stdlib.h> #include <string> #include<string.h> #define MAXSTRLEN 255 /* 可以在255以内定义最大串长 */ typedef char SString[MAXSTRLEN + 1]; /* 0号单元存放串的长度 */ void get_next(SString T, int next[]); void get_nextval(SString T, int nextval[]); int Index(SString S, SString T, int pos) { int i = pos; int j = 1; while (i <= S[0] && j <= T[0]) { if (S[i] == T[j]) {++i; ++j;} //继续比较后继字符 else {i = i - j + 2; j = 1;} //指针后退重新开始匹配 } if (j > T[0]) return i - T[0]; else return 0; } int Index_KMP_1(SString S, SString T, int pos) { int i = pos; int j = 1; int *next = (int *)malloc((T[0] + 1) * sizeof(int)); get_next(T, next); while (i <= S[0] && j <= T[0]) { if (j == 0 || S[i] == T[j]) {++i; ++j;} //继续比较后继字符 else j = next[j]; //模式串向右移动 } free(next); if (j > T[0]) return i - T[0]; //匹配成功 else return 0; } void get_next(SString T, int next[]) { int i = 1, j = 0; next[1] = 0; while (i < T[0]) { if (j == 0 || T[i] == T[j]) {++i; ++j; next[i] = j;} else j = next[j]; } } int Index_KMP_2(SString S, SString T, int pos) { int i = pos; int j = 1; int *nextval = (int *)malloc((T[0] + 1) * sizeof(int)); get_nextval(T, nextval); while (i <= S[0] && j <= T[0]) { if (j == 0 || S[i] == T[j]) {++i; ++j;} //继续比较后继字符 else j = nextval[j]; //模式串向右移动 } free(nextval); if (j > T[0]) return i - T[0]; //匹配成功 else return 0; } void get_nextval(SString T, int nextval[]) { int i = 1; nextval[1] = 0; int j = 0; while (i < T[0]) { if (j == 0 || T[i] == T[j]) { ++i; ++j; if (T[i] != T[j]) nextval[i] = j; else nextval[i] = nextval[j]; } else j = nextval[j]; } } /* 样例 s:ababcabcacbab t:abcac */ int main(){ SString S, T; scanf("%s",S+1); S[0]=strlen(S+1); S[S[0]+1]='\0'; scanf("%s",T+1); T[0]=strlen(T+1); T[T[0]+1]='\0'; printf("Index: %d\n", Index(S, T, 1));//暴力模式匹配方法 printf("Index_KMP_1: %d\n", Index_KMP_1(S, T, 1));//KMP算法 printf("Index_KMP_2: %d\n", Index_KMP_2(S, T, 1));//KMP优化算法 }