原理
两个字符串匹配过程中,利用已经匹配过的结果,减少计算次数。
找前缀和后缀的最长长度。
ne[i] = 以i结尾的前缀和后缀的最长长度
当s串和p串在i位置不想等, p串从ne[i] + 1的位置开始匹配(最长长度+1)
int ne[100010];
for (int i = 2, j = 0; i <= m; i++) {
while (j && p[i] != p[j+1]) j = ne[j];
if (p[i] == p[j+1]) j++;
ne[i] = j;
}
for (int i = 1, j = 0; i <= n; i++) {
while (j && s[i] != p[j+1]) j = ne[j];
if (s[i] == p[j+1]) j++;
if (i == m) {
//匹配完成
}
}