KMP及next数组实现代码

next数组求解:

以1开始,next[1]=0,next[2]=1,next[n] :将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。

void getNext(char *p,int *next)  
{  
    int j,k;  
    next[1]=0;  
    j=1;  
    k=0;  
    while(j1)  
    {  
        if(k==0||p[j]==p[k])    //匹配的情况下,p[j]==p[k],next[j+1]=k+1;  
        {  
            j++;  
            k++;  
            next[j]=k;  
        }  
        else                   //p[j]!=p[k],k=next[k]  
            k=next[k];  
    }  
}  

KMP实现:

#include 
#include 
#include 

using namespace std;

int KMP(string S, string T)
{
    vector<int> next = getNext(T);
    int i = 1, j = 1;
    while (S[i] != '\0' && T[j] != '\0')
    {
        if ( j==0 || S[i] == T[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j = next[j];
        }
    }
    if (T[j] == '\0')
        return i - j + 1;
    else
        return 0;
}

int main()
{
    string S = "ababaababcb";
    string T = "ababc";
    int num = KMP(S, T);
    cout << num;
    return 0;
}

你可能感兴趣的:(算法)