自我学习 - C++ KMP算法

#include <iostream>

using namespace std;

// 计算Next数组
void makeNext(const char p[], int next[]) {
    int q, k; // q是字符串下标,k是最大公共前缀
    int m = strlen(p);
    next[0] = 0; // 第一个字符的最大公共前缀是0
    for (q = 1, k = 0; q < m; ++q) { // for循环从第二个字符开始依次计算出每个字符对应的next值
        while (k > 0 && p[q] != p[k]) {
            k = next[k - 1];
        }
        if (p[q] == p[k]) {
            k++;
        }

        next[q] = k;
    }
}

// KMP算法 int kmp(const char T[], const char P[], int next[]) { int n, m; int i, q; n = strlen(T); m = strlen(P); makeNext(P, next); for (i = 0, q = 0; i < n; ++i) { // 这里是从头到尾跑一遍字符串T,KMP就是不回头的 while (q > 0 && P[q] != T[i]) { // 如果出现了字符串不相符,通过NEXT数组找到P字符串该从哪个字符开始 q = next[q - 1]; } if (P[q] == T[i]) { // 两个字符串相等自然就去比对下一个 q++; } if (q == m) { printf("Pattern occurs with shift:%d\n",(i-m+1)); } } } int main(){ int next[20]={0}; char T[] = "googlogoogle"; char P[] = "google"; printf("%s\n",T); printf("%s\n",P); kmp(T, P, next); return 0; } 

 

参考阮一峰的文章求的NEXT数组:https://www.cnblogs.com/c-cloud/p/3224788.html

posted @ 2021-03-16 23:27  adamweng  阅读(113)  评论(0)    收藏  举报