字符串-KMP算法实现(数据结构基础 第4周)

非优化版的KMP算法实现示例。
源码

#include <iostream>
#include <string>
#include <cassert>
using namespace std;

int* findNext(string P) {
    int j, k;
    int m=P.length();
    assert(m>0);    //若m=0,退出
    int* next=new int[m];  
    assert(next != 0);   //若开辟存储区失败,退出
    next[0]=-1;
    j=0; k=-1;
    while(j<m-1) {
        while(k>=0 && P[k]!=P[j])  //不等则采用KMP自找首尾子串
            k=next[k];               //k递归地向前找
        j++; k++; next[j]=k;
    }
    return next;
}
int KMPStrMatching(string T, string P, int* N, int start) {
    int j=0;     //模式的下标变量
    int i=start;  //目标的下标变量
    int pLen = P.length();  //模式的长度
    int tLen = T.length();  //目标的长度
    if (tLen-start < pLen)  //目标比模式短,匹配无法成功
    {
        return -1;
    }
    while(j<pLen && i<tLen) {  //反复比较,进行匹配
        if (j==-1 || T[i]==P[j]) 
            i++, j++;
        else
            j=N[j];     
    }
    if (j>=pLen){  //实际应该是等于吧
        return (i-pLen);
    }
    else
        return -1;
}

int main() {
    string t="ababababababb";
    string p="abababb";
    int* next;
    next = findNext(p);
    cout << KMPStrMatching(t, p, next, 0) << endl;
    return 0;
}
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/nnnnnnnnnnnny/article/details/51832965
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞