前言:kmp告诉我们有时身处逆境,不如暂时放弃往回看看,反而能柳暗花明。
有时在匹配查找字符串时候往往会遇到字符串中有相同的部分,kmp也就孕育而生了。
这种情况如果暴力做两次循环,如果遇到匹配到中间,但下一个又不匹配的情况。如果从头遍历数组肯定及其浪费时间。那么是不是有种情况可以节省大量时间呢?
没错的,就是要找到首尾相同的部分。如果匹配不成功就退回到之前相同部分的下一个,重新开始匹配,这样就能节省大量时间。
#include <iostream>
using namespace std;
const int N = 100010, M = 1000010;
int n, m;
int ne[N];
char s[M], p[N];
int main()
{
cin >> n >> p + 1 >> m >> s + 1;
//求出首位相同的部分
for (int i = 2, j = 0; i <= n; i ++ )
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++ ;
ne[i] = j;
}