C++——KMP字符串模式匹配算法

KMP字符串模式匹配算法

当我们使用简单字符串模式匹配算法时,时间复杂度为O(n*m),这里n为目标串的长度,m为模式串的长度。在循环的过程中,有很多次匹配其实存在回溯,浪费了很多时间。可以根据模式串本身的性质来设计一个新的高效算法,即跳过肯定不匹配的循环,而直接从左边子串已经相同的位置开始比较,时间复杂度大大降低,该算法就是KMP字符串模式匹配算法。

#include 
#include 

using namespace std;

int KMPIndexHelp(const string &T,const string &P,int pos,int next[]){
    int i=pos,j=0;
    while(i<T.length() && j<P.length())
    {
        if(j==-1)
        {
        i++; j=0;
        }
        else if(T[i]==P[j]){
            i++; j++;
        }
        else
        {
            j=next[j];
        }
    }

    if(j<P.length()) return false;
    else return i-j;
}

void GetNext(const string &P,int next[])
{
    next[0]=-1;
    int j=0,k=-1;
    while(j<P.length()-1)
    {
        if(k==-1)
        {
            next[j+1]=0;
            j++;k=0;
        }
        else if(P[k]==P[j])
        {
            next[j+1]=k+1;
            j++;k++;
        }
        else
        {
            k=next[k];
        }
    }
}

int KMPIndex(const string &T,const string &P,int pos=0){
   int *next=new int[P.length()];
   GetNext(P,next);
   int result=KMPIndexHelp(T,P,pos,next);
   delete []next;
   return result;
}
int main()
{
    int r=0;
    string T="acabaabaabcacx";
    string P="abaabcac";
    cout << KMPIndex(T,P,r) <<endl;
    return 0;
}

你可能感兴趣的:(数据结构与算法)