KMP算法
#include "stdafx.h" #include <iostream> using namespace std; //获取next数组的值 void GetNext(const char* pattern, int length, int *next) { int i = 0; next[i] = -1; int j = -1; while (i < length - 1) { if (-1 == j || pattern[i] == pattern[j]) { i++; j++; if (pattern[i] != pattern[j]) { next[i] = j; } else { next[i] = next[j]; } } else { j = next[j]; } } } //KMP算法 int KMP(const char *src, int slength, const char * pattern, int plength, int *next) { int i = 0; int j = 0; while (i < slength && j < plength) { if (-1 == j || src[i] == pattern[j]) { i++; j++; } else { j = next[j]; } } if (j >= plength) { return i - plength; } return -1; } int _tmain(int argc, _TCHAR* argv[]) { char src[] = "abcdababcdaedfghtevb"; char pattern[] = "ababc"; int plength = strlen(pattern); int *next = new int[plength]; GetNext(pattern, plength, next); cout<<"主串:"<<src<<endl; cout<<"子串:"<<pattern<<endl; cout<<"子串在主串的首次匹配的位置:"<<KMP(src, strlen(src), pattern, plength, next)<<endl; delete [] next; cout<<endl; return 0; }
运行界面如下: