小算法--KMP

来源:互联网 发布:淘宝上怎么用微信支付 编辑:程序博客网 时间:2024/05/17 03:26
#include <stdio.h>#include <stdlib.h>#define MAXSTRLEN 255typedef unsigned char String[MAXSTRLEN + 1];int main(void){int Index_KMP(String S, String T, int next[], int pos);//利用模式串T的next求T在主串S中第pos个字符之后的位置的KMP算法void get_next(String, int[]);//求模式串T的next值int next[MAXSTRLEN + 1] = {0};String S=" acabaabaabcacaabc";//主串String T=" abaabcac";//模式串S[0] = 17;T[0] = 8;get_next(T, next);printf("%d\n", Index_KMP(S, T, next, 1));return EXIT_SUCCESS;}int Index_KMP(String S, String T, int next[], int pos){int i = pos, j = 1;while (i <= S[0] && j <= T[0]) {if (0 == j || S[i] == T[j]) {i++;j++;} else {j = next[j];}}if (j > T[0]) {return i - T[0];} else {return 0;}}void get_next(String T, int next[]){int i = 1, j = 0;next[1] = 0;while (i < T[0]) {if (0 == j || T[i] == T[j]) {i++;j++;if (T[i] != T[j]) {next[i] = j;} else {next[i] = next[j];}} else {j = next[j];}}}