KMP算法

Posted lhlccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法相关的知识,希望对你有一定的参考价值。

重点:理解next数组的含义,减少循环的时间。

#include <bits/stdc++.h>
using namespace std;
const int N=10005;
int next[1005];

//优化过后的next 数组求法

void GetNextval(string p)

    int pLen = p.length();
    next[0] = -1;
    int k = -1;
    int j = 0;
    while (j < pLen - 1)
    
        if (k == -1 || p[j] == p[k])
        
            ++j;
            ++k;
            if (p[j] != p[k])
                next[j] = k;   //之前只有这一行
            else
                next[j] = next[k];
        
        else
        
            k = next[k];
        
    

int kmp(string s,string p)

    int i = 0;
    int j = 0;
    int sLen = s.length();
    int pLen = p.length();
    while (i < sLen && j < pLen)
    
        if (j == -1 || s[i] == p[j])
        
            i++;
            j++;
        
        else
        
            j = next[j];
        
    
    if (j == pLen)
        return i - j;
    else
        return -1;

int main()

   string s1,s2;
   cin>>s1>>s2;
   GetNextval(s2);
   cout<<kmp(s1,s2)<<endl;

 

以上是关于KMP算法的主要内容,如果未能解决你的问题,请参考以下文章

什么是KMP算法?KMP算法推导

KMP算法及KMP算法的应用(POJ2406)

KMP算法

kmp算法

kmp算法

KMP算法