KMP算法
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int* getnext(int n,string c)
{
int* next = new int[n];
next[0] = -1;
int i = 0;
int k = -1;
while (i < n - 1)
{
// int k = next[i];这是错误的。优化next数组的k应该用满足条件的最大的k值,不能更新为next[i]
while (k >= 0 && c[i] != c[k])
k = next[k];
i++;
k++; //保存较大的k值,在下次循环中使用
next[i] = k;
if (c[i] == c[k])
next[i] = next[k];
}
return next;
}
int main()
{
string t;
string p;
cin >> t >> p;
int np = p.size();
int nt = t.size();
int* next = getnext(np, p);
int i = 0;
int j = 0;
while (i < nt&&j < np)
{
if (t[i] == p[j] || j == -1) //如果j等于-1,则说明第一个都无法匹配,则直接用第0个元素和t串中第i+1个元素进行对比
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == np)
cout << "Oh~~~~~~" << endl;
else
cout << "NO" << endl;
return 0;
}