kmp算法

void getnext(const char P[], int next[])
{
    int q, k;
    int m = strlen(P); // 模板字符串的长度
    next[0] = 0;
    for(q = 1, k = 0; q < m; ++q) { // 从第二个字符开始,依次计算每个字符对应的next值
        while(k > 0 && P[q] != P[k]) {
            k = next[k-1];
        }
        if(P[q] == P[k]) {
            k++;
        }
        next[q] = k;
    }
}

int kmp(const char T[], const char P[], int next[]) 
{
    int n, m;
    int i, q;
    n = strlen(T);
    m = strlen(P);
    getnext(P, next); // 计算next数组
    for(i = 0, q = 0; i < n; ++i) {
        while(q > 0 && P[q] != T[i]) {
            q = next[q-1];
        }
        if(P[q] == T[i]) q++;
        if(q == m) {
            // 输出找到的位置
            cout << (i-m+1) << endl;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容