KMP算法模板(C/C++)

KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!

KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索

模板代码如下:

#include<bits/stdc++.h>
using namespace std;
 
const int maxn = 1e6+5;
int Next[maxn], n1, n2;
string str, mo;
 
void GetNext() 
{
    int i = 0, j = -1;
    while(i < n2) 
	{
        if(j == -1 || mo[i] == mo[j]) 
		{
            i++; j++;
            Next[i] = j;
        } 
		else j = Next[j];
    }
    return;
}
 
int kmp() 
{
    int cnt = 0;
    int i = 0, j = 0;
 
    while(i < n1) 
	{
        if (j == -1 || str[i] == mo[j]) 
		{
            i++; j++;
        } 
		else j = Next[j];
        if(j == n2) 
		{
            cnt++;//计算次数 
            cout<<i-n2+1<<endl;//返回位置 
            j=Next[j];     
        }
    }
    cout<<cnt;
}
 
int main() {
    cin >> str >> mo;
 
    n1 = str.length();
    n2 = mo.length();
    Next[0] = -1;
    GetNext();
 	kmp();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_71934846/article/details/128914941