以前写的代码,先搬运到CSDN上来。先贴代码,后面补说明
- int KMP(char * t, char * p)
- {
- int i = 0;
- int j = 0;
-
- int* pNext = new int[(int)strlen(p)]{-1};
- GetNext(p,pNext);
-
- while (i < (int)strlen(t) && j < (int)strlen(p))
- {
- if (j == -1 || t[i] == p[j])
- {
- i++;
- j++;
- }
- else
- j = pNext[j];
- }
-
- if (j == strlen(p))
- return i - j;
- else
- return -1;
- }
- void GetNext(char * p, int * next)
- {
- next[0] = -1;
- int i = 0, j = -1;
-
- while (i < (int)strlen(p))
- {
- if (j == -1 || p[i] == p[j])
- {
- ++i;
- ++j;
- next[i] = j;
- }
- else
- j = next[j];
- }
- }