kmp:高效查找目标串的算法。
原理:通过记录目标串的规律, 通过后缀与前缀相同的规律,确定当比较了前几个相同是跳跃几个无需比较的元素(之前已经比较过)。
模板代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int Next[100050];
void kmp_pre(char s[], int len)
{
int i = 0, j = -1;
Next[0] = -1;
while(i < len)
{
while(j != -1 && s[i] != s[j]) j = Next[j];
Next[++i] = ++j;
}
}
// s为要查找的串, ss为主串
int kmp_count(char s[], int len_s, char ss[], int len_ss)
{
kmp_pre(s, len_s);
int i = 0, j = 0;
int cnt= 0;
while(i < len_ss)
{
while(j != -1 && ss[i] != s[j]) j = Next[j];
i++; j++;
if(j >= len_s)
{
cnt++;
j = Next[j];
}
}
return cnt;
}
int main()
{
return 0;
}