str表示文本串,m表示模式串;

str[i+j] 和 m[j] 是正在进行匹配的字符;

 

KMP的时间复杂度是O(m+n)  ,  暴力求解的时间复杂度是O(m*n)

 

KMP利用了B[0:j]和A[i:j]是相同的这一点,而暴力求解显然做不到.

 

int kmp(string str,string m)
{
    int next[MAXN];
    next[0] = -1;
    int i=0;
    int j=-1;
    while(i<m.size())
    {
        if(j==-1 || m[i]==m[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }

    i=0;
    j=0;
    while(i<str.size() && j<m.size())
    {
        if(j==-1 || str[i]==m[j])
        {
            i++;
            j++;
        }
        else
        {
            j =next[j];
        }
     if(j==m.size()-1)
     {
      return i-j;
     } }
   return -1; }

 

版权声明:本文为dynmi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dynmi/p/12497500.html